4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * CDDL HEADER START
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * The contents of this file are subject to the terms of the
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Common Development and Distribution License (the "License").
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * You may not use this file except in compliance with the License.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * or http://www.opensolaris.org/os/licensing.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * See the License for the specific language governing permissions
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * and limitations under the License.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * When distributing Covered Code, include this CDDL HEADER in each
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * If applicable, add the following below this CDDL HEADER, with the
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * fields enclosed by brackets "[]" replaced with your own identifying
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * information: Portions Copyright [yyyy] [name of copyright owner]
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * CDDL HEADER END
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
a19609f85693e4e7d7e744d836a4e87193c934e4jv * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Copyright (c) 1983,1984,1985,1986,1987,1988,1989 AT&T.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * All rights reserved.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <sys/param.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <sys/systm.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <sys/thread.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <sys/t_lock.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <sys/time.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <sys/vnode.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <sys/vfs.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <sys/errno.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <sys/buf.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <sys/stat.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <sys/cred.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <sys/kmem.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <sys/debug.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <sys/vmsystm.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <sys/flock.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <sys/share.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <sys/cmn_err.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <sys/tiuser.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <sys/sysmacros.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <sys/callb.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <sys/acl.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <sys/kstat.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <sys/signal.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <sys/list.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <sys/zone.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross#include <netsmb/smb.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <netsmb/smb_conn.h>
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross#include <netsmb/smb_subr.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <smbfs/smbfs.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <smbfs/smbfs_node.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <smbfs/smbfs_subr.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <vm/hat.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <vm/as.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <vm/page.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <vm/pvn.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <vm/seg.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <vm/seg_map.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <vm/seg_vn.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Rossstatic int smbfs_getattr_cache(vnode_t *, smbfattr_t *);
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Rossstatic void smbfattr_to_vattr(vnode_t *, smbfattr_t *, vattr_t *);
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Rossstatic void smbfattr_to_xvattr(smbfattr_t *, vattr_t *);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * The following code provide zone support in order to perform an action
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * for each smbfs mount in a zone. This is also where we would add
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * per-zone globals and kernel threads for the smbfs module (since
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * they must be terminated by the shutdown callback).
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlowstruct smi_globals {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow kmutex_t smg_lock; /* lock protecting smg_list */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow list_t smg_list; /* list of SMBFS mounts in zone */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow boolean_t smg_destructor_called;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow};
4bff34e37def8a90f9194d81bc345c52ba20086athurlowtypedef struct smi_globals smi_globals_t;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlowstatic zone_key_t smi_list_key;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross/*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Attributes caching:
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross *
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Attributes are cached in the smbnode in struct vattr form.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * There is a time associated with the cached attributes (r_attrtime)
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * which tells whether the attributes are valid. The time is initialized
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * to the difference between current time and the modify time of the vnode
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * when new attributes are cached. This allows the attributes for
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * files that have changed recently to be timed out sooner than for files
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * that have not changed for a long time. There are minimum and maximum
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * timeout values that can be set per mount point.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross/*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Validate caches by checking cached attributes. If they have timed out
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * get the attributes from the server and compare mtimes. If mtimes are
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * different purge all caches for this vnode.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Rossint
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Rosssmbfs_validate_caches(
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross struct vnode *vp,
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross cred_t *cr)
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross{
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross struct vattr va;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross va.va_mask = AT_SIZE;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross return (smbfsgetattr(vp, &va, cr));
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross}
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross/*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Purge all of the various data caches.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross/*ARGSUSED*/
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Rossvoid
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Rosssmbfs_purge_caches(struct vnode *vp)
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross{
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross#if 0 /* not yet: mmap support */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross /*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * NFS: Purge the DNLC for this vp,
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Clear any readdir state bits,
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * the readlink response cache, ...
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross smbnode_t *np = VTOSMB(vp);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross /*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Flush the page cache.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross if (vn_has_cached_data(vp)) {
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross (void) VOP_PUTPAGE(vp, (u_offset_t)0, 0, B_INVAL, cr, NULL);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross }
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross#endif /* not yet */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross}
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross/*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Check the attribute cache to see if the new attributes match
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * those cached. If they do, the various `data' caches are
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * considered to be good. Otherwise, purge the cached data.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Rossvoid
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Rosssmbfs_cache_check(
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross struct vnode *vp,
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross struct smbfattr *fap)
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross{
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross smbnode_t *np;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross int purge_data = 0;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross int purge_acl = 0;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross np = VTOSMB(vp);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross mutex_enter(&np->r_statelock);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross /*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Compare with NFS macro: CACHE_VALID
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * If the mtime or size has changed,
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * purge cached data.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross if (np->r_attr.fa_mtime.tv_sec != fap->fa_mtime.tv_sec ||
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross np->r_attr.fa_mtime.tv_nsec != fap->fa_mtime.tv_nsec)
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross purge_data = 1;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross if (np->r_attr.fa_size != fap->fa_size)
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross purge_data = 1;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross if (np->r_attr.fa_ctime.tv_sec != fap->fa_ctime.tv_sec ||
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross np->r_attr.fa_ctime.tv_nsec != fap->fa_ctime.tv_nsec)
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross purge_acl = 1;
bd7c6f51f14365fc31d408903b38c02177384d3dGordon Ross
bd7c6f51f14365fc31d408903b38c02177384d3dGordon Ross if (purge_acl) {
bd7c6f51f14365fc31d408903b38c02177384d3dGordon Ross /* just invalidate r_secattr (XXX: OK?) */
bd7c6f51f14365fc31d408903b38c02177384d3dGordon Ross np->r_sectime = gethrtime();
bd7c6f51f14365fc31d408903b38c02177384d3dGordon Ross }
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross mutex_exit(&np->r_statelock);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross if (purge_data)
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross smbfs_purge_caches(vp);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross}
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross/*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Set attributes cache for given vnode using vnode attributes.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * From NFS: nfs_attrcache_va
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross#if 0 /* not yet (not sure if we need this) */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Rossvoid
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Rosssmbfs_attrcache_va(vnode_t *vp, struct vattr *vap)
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross{
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross smbfattr_t fa;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross smbnode_t *np;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross vattr_to_fattr(vp, vap, &fa);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross smbfs_attrcache_fa(vp, &fa);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross}
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross#endif /* not yet */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross/*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Set attributes cache for given vnode using SMB fattr
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * and update the attribute cache timeout.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross *
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * From NFS: nfs_attrcache, nfs_attrcache_va
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Rossvoid
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Rosssmbfs_attrcache_fa(vnode_t *vp, struct smbfattr *fap)
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross{
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross smbnode_t *np;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross smbmntinfo_t *smi;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross hrtime_t delta, now;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross u_offset_t newsize;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross vtype_t vtype, oldvt;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross mode_t mode;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross np = VTOSMB(vp);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross smi = VTOSMI(vp);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross /*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * We allow v_type to change, so set that here
42d159821800ff240cc201c8fe07f575b9e8a62bGordon Ross * (and the mode, which depends on the type).
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross if (fap->fa_attr & SMB_FA_DIR) {
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross vtype = VDIR;
42d159821800ff240cc201c8fe07f575b9e8a62bGordon Ross mode = smi->smi_dmode;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross } else {
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross vtype = VREG;
42d159821800ff240cc201c8fe07f575b9e8a62bGordon Ross mode = smi->smi_fmode;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross }
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross mutex_enter(&np->r_statelock);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross now = gethrtime();
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross /*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Delta is the number of nanoseconds that we will
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * cache the attributes of the file. It is based on
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * the number of nanoseconds since the last time that
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * we detected a change. The assumption is that files
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * that changed recently are likely to change again.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * There is a minimum and a maximum for regular files
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * and for directories which is enforced though.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross *
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Using the time since last change was detected
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * eliminates direct comparison or calculation
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * using mixed client and server times. SMBFS
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * does not make any assumptions regarding the
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * client and server clocks being synchronized.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross if (fap->fa_mtime.tv_sec != np->r_attr.fa_mtime.tv_sec ||
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross fap->fa_mtime.tv_nsec != np->r_attr.fa_mtime.tv_nsec ||
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross fap->fa_size != np->r_attr.fa_size)
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross np->r_mtime = now;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross if ((smi->smi_flags & SMI_NOAC) || (vp->v_flag & VNOCACHE))
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross delta = 0;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross else {
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross delta = now - np->r_mtime;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross if (vtype == VDIR) {
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross if (delta < smi->smi_acdirmin)
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross delta = smi->smi_acdirmin;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross else if (delta > smi->smi_acdirmax)
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross delta = smi->smi_acdirmax;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross } else {
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross if (delta < smi->smi_acregmin)
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross delta = smi->smi_acregmin;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross else if (delta > smi->smi_acregmax)
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross delta = smi->smi_acregmax;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross }
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross }
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross np->r_attrtime = now + delta;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross np->r_attr = *fap;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross np->n_mode = mode;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross oldvt = vp->v_type;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross vp->v_type = vtype;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross /*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Shall we update r_size? (local notion of size)
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross *
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * The real criteria for updating r_size should be:
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * if the file has grown on the server, or if
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * the client has not modified the file.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross *
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Also deal with the fact that SMB presents
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * directories as having size=0. Doing that
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * here and leaving fa_size as returned OtW
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * avoids fixing the size lots of places.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross newsize = fap->fa_size;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross if (vtype == VDIR && newsize < DEV_BSIZE)
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross newsize = DEV_BSIZE;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross if (np->r_size != newsize) {
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross#if 0 /* not yet: mmap support */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross if (!vn_has_cached_data(vp) || ...)
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross /* XXX: See NFS page cache code. */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross#endif /* not yet */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross /* OK to set the size. */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross np->r_size = newsize;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross }
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross /* NFS: np->r_flags &= ~RWRITEATTR; */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross np->n_flag &= ~NATTRCHANGED;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross mutex_exit(&np->r_statelock);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross if (oldvt != vtype) {
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross SMBVDEBUG("vtype change %d to %d\n", oldvt, vtype);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross }
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross}
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross/*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Fill in attribute from the cache.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross *
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * If valid, copy to *fap and return zero,
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * otherwise return an error.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross *
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * From NFS: nfs_getattr_cache()
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Rossint
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Rosssmbfs_getattr_cache(vnode_t *vp, struct smbfattr *fap)
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross{
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross smbnode_t *np;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross int error;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross np = VTOSMB(vp);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross mutex_enter(&np->r_statelock);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross if (gethrtime() >= np->r_attrtime) {
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross /* cache expired */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross error = ENOENT;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross } else {
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross /* cache is valid */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross *fap = np->r_attr;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross error = 0;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross }
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross mutex_exit(&np->r_statelock);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross return (error);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross}
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross/*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Get attributes over-the-wire and update attributes cache
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * if no error occurred in the over-the-wire operation.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Return 0 if successful, otherwise error.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * From NFS: nfs_getattr_otw
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Rossint
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Rosssmbfs_getattr_otw(vnode_t *vp, struct smbfattr *fap, cred_t *cr)
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross{
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross struct smbnode *np;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross struct smb_cred scred;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross int error;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross np = VTOSMB(vp);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross /*
bd7c6f51f14365fc31d408903b38c02177384d3dGordon Ross * NFS uses the ACL rpc here (if smi_flags & SMI_ACL)
bd7c6f51f14365fc31d408903b38c02177384d3dGordon Ross * With SMB, getting the ACL is a significantly more
bd7c6f51f14365fc31d408903b38c02177384d3dGordon Ross * expensive operation, so we do that only when asked
bd7c6f51f14365fc31d408903b38c02177384d3dGordon Ross * for the uid/gid. See smbfsgetattr().
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross /* Shared lock for (possible) n_fid use. */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross if (smbfs_rw_enter_sig(&np->r_lkserlock, RW_READER, SMBINTR(vp)))
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross return (EINTR);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross smb_credinit(&scred, cr);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross bzero(fap, sizeof (*fap));
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross error = smbfs_smb_getfattr(np, fap, &scred);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross smb_credrele(&scred);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross smbfs_rw_exit(&np->r_lkserlock);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross if (error) {
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross /* NFS had: PURGE_STALE_FH(error, vp, cr) */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross smbfs_attrcache_remove(np);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross if (error == ENOENT || error == ENOTDIR) {
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross /*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Getattr failed because the object was
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * removed or renamed by another client.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Remove any cached attributes under it.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross smbfs_attrcache_prune(np);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross }
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross return (error);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross }
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross /*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * NFS: smbfs_cache_fattr(vap, fa, vap, t, cr);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * which did: fattr_to_vattr, nfs_attr_cache.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * We cache the fattr form, so just do the
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * cache check and store the attributes.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross smbfs_cache_check(vp, fap);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross smbfs_attrcache_fa(vp, fap);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross return (0);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross}
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross/*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Return either cached or remote attributes. If get remote attr
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * use them to check and invalidate caches, then cache the new attributes.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross *
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * From NFS: nfsgetattr()
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Rossint
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Rosssmbfsgetattr(vnode_t *vp, struct vattr *vap, cred_t *cr)
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross{
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross struct smbfattr fa;
bd7c6f51f14365fc31d408903b38c02177384d3dGordon Ross smbmntinfo_t *smi;
bd7c6f51f14365fc31d408903b38c02177384d3dGordon Ross uint_t mask;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross int error;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
bd7c6f51f14365fc31d408903b38c02177384d3dGordon Ross smi = VTOSMI(vp);
bd7c6f51f14365fc31d408903b38c02177384d3dGordon Ross
a19609f85693e4e7d7e744d836a4e87193c934e4jv ASSERT(curproc->p_zone == smi->smi_zone_ref.zref_zone);
bd7c6f51f14365fc31d408903b38c02177384d3dGordon Ross
bd7c6f51f14365fc31d408903b38c02177384d3dGordon Ross /*
bd7c6f51f14365fc31d408903b38c02177384d3dGordon Ross * If asked for UID or GID, update n_uid, n_gid.
bd7c6f51f14365fc31d408903b38c02177384d3dGordon Ross */
bd7c6f51f14365fc31d408903b38c02177384d3dGordon Ross mask = AT_ALL;
bd7c6f51f14365fc31d408903b38c02177384d3dGordon Ross if (vap->va_mask & (AT_UID | AT_GID)) {
bd7c6f51f14365fc31d408903b38c02177384d3dGordon Ross if (smi->smi_flags & SMI_ACL)
bd7c6f51f14365fc31d408903b38c02177384d3dGordon Ross (void) smbfs_acl_getids(vp, cr);
bd7c6f51f14365fc31d408903b38c02177384d3dGordon Ross /* else leave as set in make_smbnode */
bd7c6f51f14365fc31d408903b38c02177384d3dGordon Ross } else {
bd7c6f51f14365fc31d408903b38c02177384d3dGordon Ross mask &= ~(AT_UID | AT_GID);
bd7c6f51f14365fc31d408903b38c02177384d3dGordon Ross }
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross /*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * If we've got cached attributes, just use them;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * otherwise go to the server to get attributes,
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * which will update the cache in the process.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross error = smbfs_getattr_cache(vp, &fa);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross if (error)
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross error = smbfs_getattr_otw(vp, &fa, cr);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross if (error)
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross return (error);
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross vap->va_mask |= mask;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross /*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Re. client's view of the file size, see:
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * smbfs_attrcache_fa, smbfs_getattr_otw
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross */
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross smbfattr_to_vattr(vp, &fa, vap);
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross if (vap->va_mask & AT_XVATTR)
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross smbfattr_to_xvattr(&fa, vap);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross return (0);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross}
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross/*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Convert SMB over the wire attributes to vnode form.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Returns 0 for success, error if failed (overflow, etc).
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * From NFS: nattr_to_vattr()
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross */
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Rossvoid
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Rosssmbfattr_to_vattr(vnode_t *vp, struct smbfattr *fa, struct vattr *vap)
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross{
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross struct smbnode *np = VTOSMB(vp);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross /*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Take type, mode, uid, gid from the smbfs node,
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * which has have been updated by _getattr_otw.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross vap->va_type = vp->v_type;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross vap->va_mode = np->n_mode;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross vap->va_uid = np->n_uid;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross vap->va_gid = np->n_gid;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross vap->va_fsid = vp->v_vfsp->vfs_dev;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross vap->va_nodeid = np->n_ino;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross vap->va_nlink = 1;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross /*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Difference from NFS here: We cache attributes as
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * reported by the server, so r_attr.fa_size is the
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * server's idea of the file size. This is called
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * for getattr, so we want to return the client's
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * idea of the file size. NFS deals with that in
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * nfsgetattr(), the equivalent of our caller.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross vap->va_size = np->r_size;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross /*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Times. Note, already converted from NT to
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Unix form (in the unmarshalling code).
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross vap->va_atime = fa->fa_atime;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross vap->va_mtime = fa->fa_mtime;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross vap->va_ctime = fa->fa_ctime;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross /*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * rdev, blksize, seq are made up.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * va_nblocks is 512 byte blocks.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross vap->va_rdev = vp->v_rdev;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross vap->va_blksize = MAXBSIZE;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross vap->va_nblocks = (fsblkcnt64_t)btod(np->r_attr.fa_allocsz);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross vap->va_seq = 0;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross}
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross/*
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross * smbfattr_to_xvattr: like smbfattr_to_vattr but for
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross * Extensible system attributes (PSARC 2007/315)
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross */
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Rossstatic void
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Rosssmbfattr_to_xvattr(struct smbfattr *fa, struct vattr *vap)
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross{
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross xvattr_t *xvap = (xvattr_t *)vap; /* *vap may be xvattr_t */
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross xoptattr_t *xoap = NULL;
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross if ((xoap = xva_getxoptattr(xvap)) == NULL)
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross return;
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross if (XVA_ISSET_REQ(xvap, XAT_CREATETIME)) {
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross xoap->xoa_createtime = fa->fa_createtime;
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross XVA_SET_RTN(xvap, XAT_CREATETIME);
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross }
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross if (XVA_ISSET_REQ(xvap, XAT_ARCHIVE)) {
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross xoap->xoa_archive =
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross ((fa->fa_attr & SMB_FA_ARCHIVE) != 0);
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross XVA_SET_RTN(xvap, XAT_ARCHIVE);
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross }
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross if (XVA_ISSET_REQ(xvap, XAT_SYSTEM)) {
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross xoap->xoa_system =
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross ((fa->fa_attr & SMB_FA_SYSTEM) != 0);
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross XVA_SET_RTN(xvap, XAT_SYSTEM);
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross }
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross if (XVA_ISSET_REQ(xvap, XAT_READONLY)) {
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross xoap->xoa_readonly =
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross ((fa->fa_attr & SMB_FA_RDONLY) != 0);
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross XVA_SET_RTN(xvap, XAT_READONLY);
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross }
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross if (XVA_ISSET_REQ(xvap, XAT_HIDDEN)) {
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross xoap->xoa_hidden =
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross ((fa->fa_attr & SMB_FA_HIDDEN) != 0);
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross XVA_SET_RTN(xvap, XAT_HIDDEN);
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross }
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross}
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross/*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * SMB Client initialization and cleanup.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Much of it is per-zone now.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/* ARGSUSED */
4bff34e37def8a90f9194d81bc345c52ba20086athurlowstatic void *
4bff34e37def8a90f9194d81bc345c52ba20086athurlowsmbfs_zone_init(zoneid_t zoneid)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smi_globals_t *smg;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smg = kmem_alloc(sizeof (*smg), KM_SLEEP);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mutex_init(&smg->smg_lock, NULL, MUTEX_DEFAULT, NULL);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow list_create(&smg->smg_list, sizeof (smbmntinfo_t),
4bff34e37def8a90f9194d81bc345c52ba20086athurlow offsetof(smbmntinfo_t, smi_zone_node));
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smg->smg_destructor_called = B_FALSE;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (smg);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Callback routine to tell all SMBFS mounts in the zone to stop creating new
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * threads. Existing threads should exit.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/* ARGSUSED */
4bff34e37def8a90f9194d81bc345c52ba20086athurlowstatic void
4bff34e37def8a90f9194d81bc345c52ba20086athurlowsmbfs_zone_shutdown(zoneid_t zoneid, void *data)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smi_globals_t *smg = data;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smbmntinfo_t *smi;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow ASSERT(smg != NULL);
4bff34e37def8a90f9194d81bc345c52ba20086athurlowagain:
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mutex_enter(&smg->smg_lock);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow for (smi = list_head(&smg->smg_list); smi != NULL;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smi = list_next(&smg->smg_list, smi)) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * If we've done the shutdown work for this FS, skip.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Once we go off the end of the list, we're done.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (smi->smi_flags & SMI_DEAD)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow continue;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * We will do work, so not done. Get a hold on the FS.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow VFS_HOLD(smi->smi_vfsp);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mutex_enter(&smi->smi_lock);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smi->smi_flags |= SMI_DEAD;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mutex_exit(&smi->smi_lock);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Drop lock and release FS, which may change list, then repeat.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * We're done when every mi has been done or the list is empty.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mutex_exit(&smg->smg_lock);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow VFS_RELE(smi->smi_vfsp);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow goto again;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mutex_exit(&smg->smg_lock);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlowstatic void
4bff34e37def8a90f9194d81bc345c52ba20086athurlowsmbfs_zone_free_globals(smi_globals_t *smg)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow list_destroy(&smg->smg_list); /* makes sure the list is empty */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mutex_destroy(&smg->smg_lock);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow kmem_free(smg, sizeof (*smg));
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/* ARGSUSED */
4bff34e37def8a90f9194d81bc345c52ba20086athurlowstatic void
4bff34e37def8a90f9194d81bc345c52ba20086athurlowsmbfs_zone_destroy(zoneid_t zoneid, void *data)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smi_globals_t *smg = data;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow ASSERT(smg != NULL);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mutex_enter(&smg->smg_lock);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (list_head(&smg->smg_list) != NULL) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /* Still waiting for VFS_FREEVFS() */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smg->smg_destructor_called = B_TRUE;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mutex_exit(&smg->smg_lock);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smbfs_zone_free_globals(smg);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Add an SMBFS mount to the per-zone list of SMBFS mounts.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlowvoid
4bff34e37def8a90f9194d81bc345c52ba20086athurlowsmbfs_zonelist_add(smbmntinfo_t *smi)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smi_globals_t *smg;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
a19609f85693e4e7d7e744d836a4e87193c934e4jv smg = zone_getspecific(smi_list_key, smi->smi_zone_ref.zref_zone);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mutex_enter(&smg->smg_lock);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow list_insert_head(&smg->smg_list, smi);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mutex_exit(&smg->smg_lock);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Remove an SMBFS mount from the per-zone list of SMBFS mounts.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlowvoid
4bff34e37def8a90f9194d81bc345c52ba20086athurlowsmbfs_zonelist_remove(smbmntinfo_t *smi)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smi_globals_t *smg;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
a19609f85693e4e7d7e744d836a4e87193c934e4jv smg = zone_getspecific(smi_list_key, smi->smi_zone_ref.zref_zone);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mutex_enter(&smg->smg_lock);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow list_remove(&smg->smg_list, smi);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * We can be called asynchronously by VFS_FREEVFS() after the zone
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * shutdown/destroy callbacks have executed; if so, clean up the zone's
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * smi_globals.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (list_head(&smg->smg_list) == NULL &&
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smg->smg_destructor_called == B_TRUE) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smbfs_zone_free_globals(smg);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mutex_exit(&smg->smg_lock);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross#ifdef lint
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross#define NEED_SMBFS_CALLBACKS 1
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross#endif
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#ifdef NEED_SMBFS_CALLBACKS
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Call-back hooks for netsmb, in case we want them.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Apple's VFS wants them. We may not need them.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross/*ARGSUSED*/
4bff34e37def8a90f9194d81bc345c52ba20086athurlowstatic void smbfs_dead(smb_share_t *ssp)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross /*
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * Walk the mount list, finding all mounts
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * using this share...
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross/*ARGSUSED*/
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rossstatic void smbfs_cb_nop(smb_share_t *ss)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /* no-op */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlowsmb_fscb_t smbfs_cb = {
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross .fscb_disconn = smbfs_dead,
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross .fscb_connect = smbfs_cb_nop,
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross .fscb_down = smbfs_cb_nop,
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross .fscb_up = smbfs_cb_nop };
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#endif /* NEED_SMBFS_CALLBACKS */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * SMBFS Client initialization routine. This routine should only be called
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * once. It performs the following tasks:
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * - Initalize all global locks
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * - Call sub-initialization routines (localize access to variables)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlowint
4bff34e37def8a90f9194d81bc345c52ba20086athurlowsmbfs_clntinit(void)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow zone_key_create(&smi_list_key, smbfs_zone_init, smbfs_zone_shutdown,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smbfs_zone_destroy);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#ifdef NEED_SMBFS_CALLBACKS
c1374a13e412c4ec42cba867e57347a0e049a822Surya Prakki (void) smb_fscb_set(&smbfs_cb);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#endif /* NEED_SMBFS_CALLBACKS */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (0);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * This routine is called when the modunload is called. This will cleanup
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * the previously allocated/initialized nodes.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlowvoid
4bff34e37def8a90f9194d81bc345c52ba20086athurlowsmbfs_clntfini(void)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#ifdef NEED_SMBFS_CALLBACKS
c1374a13e412c4ec42cba867e57347a0e049a822Surya Prakki (void) smb_fscb_set(NULL);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#endif /* NEED_SMBFS_CALLBACKS */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow (void) zone_key_delete(smi_list_key);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}