4bff34e37def8a90f9194d81bc345c52ba20086athurlow * CDDL HEADER START
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 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * See the License for the specific language governing permissions
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * and limitations under the License.
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 * CDDL HEADER END
a19609f85693e4e7d7e744d836a4e87193c934e4jv * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Copyright (c) 1983,1984,1985,1986,1987,1988,1989 AT&T.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * All rights reserved.
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 *);
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).
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Attributes caching:
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 * 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 * Purge all of the various data caches.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross#if 0 /* not yet: mmap support */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * NFS: Purge the DNLC for this vp,
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Clear any readdir state bits,
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * the readlink response cache, ...
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Flush the page cache.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross (void) VOP_PUTPAGE(vp, (u_offset_t)0, 0, B_INVAL, cr, NULL);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross#endif /* not yet */
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 * Compare with NFS macro: CACHE_VALID
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * If the mtime or size has changed,
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * purge cached data.
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 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)
bd7c6f51f14365fc31d408903b38c02177384d3dGordon Ross /* just invalidate r_secattr (XXX: OK?) */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Set attributes cache for given vnode using vnode attributes.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * From NFS: nfs_attrcache_va
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross#if 0 /* not yet (not sure if we need this) */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Rosssmbfs_attrcache_va(vnode_t *vp, struct vattr *vap)
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross#endif /* not yet */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Set attributes cache for given vnode using SMB fattr
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * and update the attribute cache timeout.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * From NFS: nfs_attrcache, nfs_attrcache_va
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Rosssmbfs_attrcache_fa(vnode_t *vp, struct smbfattr *fap)
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * We allow v_type to change, so set that here
42d159821800ff240cc201c8fe07f575b9e8a62bGordon Ross * (and the mode, which depends on the type).
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 * 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 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 if ((smi->smi_flags & SMI_NOAC) || (vp->v_flag & VNOCACHE))
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Shall we update r_size? (local notion of size)
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 * 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#if 0 /* not yet: mmap support */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross /* XXX: See NFS page cache code. */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross#endif /* not yet */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross /* OK to set the size. */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross /* NFS: np->r_flags &= ~RWRITEATTR; */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross SMBVDEBUG("vtype change %d to %d\n", oldvt, vtype);
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Fill in attribute from the cache.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * If valid, copy to *fap and return zero,
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * otherwise return an error.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * From NFS: nfs_getattr_cache()
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Rosssmbfs_getattr_cache(vnode_t *vp, struct smbfattr *fap)
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross /* cache expired */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross /* cache is valid */
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 Rosssmbfs_getattr_otw(vnode_t *vp, struct smbfattr *fap, cred_t *cr)
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 /* Shared lock for (possible) n_fid use. */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross if (smbfs_rw_enter_sig(&np->r_lkserlock, RW_READER, SMBINTR(vp)))
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross /* NFS had: PURGE_STALE_FH(error, vp, cr) */
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 * 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 * 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 * From NFS: nfsgetattr()
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Rosssmbfsgetattr(vnode_t *vp, struct vattr *vap, cred_t *cr)
bd7c6f51f14365fc31d408903b38c02177384d3dGordon Ross * If asked for UID or GID, update n_uid, n_gid.
bd7c6f51f14365fc31d408903b38c02177384d3dGordon Ross /* else leave as set in make_smbnode */
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 * Re. client's view of the file size, see:
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * smbfs_attrcache_fa, smbfs_getattr_otw
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 Rosssmbfattr_to_vattr(vnode_t *vp, struct smbfattr *fa, struct vattr *vap)
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Take type, mode, uid, gid from the smbfs node,
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * which has have been updated by _getattr_otw.
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 * Times. Note, already converted from NT to
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Unix form (in the unmarshalling code).
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * rdev, blksize, seq are made up.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * va_nblocks is 512 byte blocks.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross vap->va_nblocks = (fsblkcnt64_t)btod(np->r_attr.fa_allocsz);
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross * smbfattr_to_xvattr: like smbfattr_to_vattr but for
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross * Extensible system attributes (PSARC 2007/315)
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Rosssmbfattr_to_xvattr(struct smbfattr *fa, struct vattr *vap)
28162916a3f5a19f85a16b70e708bbe9235fb7c0Gordon Ross xvattr_t *xvap = (xvattr_t *)vap; /* *vap may be xvattr_t */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * SMB Client initialization and cleanup.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Much of it is per-zone now.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/* ARGSUSED */
4bff34e37def8a90f9194d81bc345c52ba20086athurlowstatic void *
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mutex_init(&smg->smg_lock, NULL, MUTEX_DEFAULT, NULL);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Callback routine to tell all SMBFS mounts in the zone to stop creating new
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * threads. Existing threads should exit.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/* ARGSUSED */
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 * We will do work, so not done. Get a hold on the FS.
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 list_destroy(&smg->smg_list); /* makes sure the list is empty */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/* ARGSUSED */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /* Still waiting for VFS_FREEVFS() */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Add an SMBFS mount to the per-zone list of SMBFS mounts.
a19609f85693e4e7d7e744d836a4e87193c934e4jv smg = zone_getspecific(smi_list_key, smi->smi_zone_ref.zref_zone);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Remove an SMBFS mount from the per-zone list of SMBFS mounts.
a19609f85693e4e7d7e744d836a4e87193c934e4jv smg = zone_getspecific(smi_list_key, smi->smi_zone_ref.zref_zone);
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 * Call-back hooks for netsmb, in case we want them.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Apple's VFS wants them. We may not need them.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * Walk the mount list, finding all mounts
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * using this share...
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /* no-op */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#endif /* NEED_SMBFS_CALLBACKS */
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 zone_key_create(&smi_list_key, smbfs_zone_init, smbfs_zone_shutdown,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#endif /* NEED_SMBFS_CALLBACKS */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (0);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * This routine is called when the modunload is called. This will cleanup
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * the previously allocated/initialized nodes.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#endif /* NEED_SMBFS_CALLBACKS */