xref: /illumos-gate/usr/src/uts/common/fs/smbsrv/smb_kutil.c (revision c13be35a2c14be5433f5d23a6c4f84e66439b7b6)
19fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
29fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * CDDL HEADER START
39fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
49fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * The contents of this file are subject to the terms of the
59fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Common Development and Distribution License (the "License").
69fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * You may not use this file except in compliance with the License.
79fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
89fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
99fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * or http://www.opensolaris.org/os/licensing.
109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * See the License for the specific language governing permissions
119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * and limitations under the License.
129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * When distributing Covered Code, include this CDDL HEADER in each
149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * If applicable, add the following below this CDDL HEADER, with the
169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * fields enclosed by brackets "[]" replaced with your own identifying
179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * information: Portions Copyright [yyyy] [name of copyright owner]
189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * CDDL HEADER END
209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
21*c13be35aSGordon Ross 
229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
23c5866007SKeyur Desai  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
24*c13be35aSGordon Ross  * Copyright 2012 Nexenta Systems, Inc. All rights reserved.
259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <sys/param.h>
289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <sys/types.h>
299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <sys/tzfile.h>
309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <sys/atomic.h>
319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <sys/kidmap.h>
329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <sys/time.h>
33148c5f43SAlan Wright #include <sys/spl.h>
349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <sys/cpuvar.h>
35148c5f43SAlan Wright #include <sys/random.h>
369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_kproto.h>
379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_fsops.h>
389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smbinfo.h>
399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_xdr.h>
409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_vops.h>
419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_idmap.h>
429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <sys/sid.h>
449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <sys/priv_names.h>
459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static kmem_cache_t	*smb_dtor_cache;
479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static boolean_t	smb_llist_initialized = B_FALSE;
489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static boolean_t smb_thread_continue_timedwait_locked(smb_thread_t *, int);
509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
51148c5f43SAlan Wright static boolean_t smb_avl_hold(smb_avl_t *);
52148c5f43SAlan Wright static void smb_avl_rele(smb_avl_t *);
53148c5f43SAlan Wright 
549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States time_t tzh_leapcnt = 0;
559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States struct tm
579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *smb_gmtime_r(time_t *clock, struct tm *result);
589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States time_t
609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_timegm(struct tm *tm);
619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States struct	tm {
639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int	tm_sec;
649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int	tm_min;
659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int	tm_hour;
669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int	tm_mday;
679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int	tm_mon;
689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int	tm_year;
699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int	tm_wday;
709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int	tm_yday;
719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int	tm_isdst;
729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States };
739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int days_in_month[] = {
759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States };
779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int
799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_ascii_or_unicode_strlen(struct smb_request *sr, char *str)
809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (sr->smb_flg2 & SMB_FLAGS2_UNICODE)
829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (smb_wcequiv_strlen(str));
839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (strlen(str));
849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int
879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_ascii_or_unicode_strlen_null(struct smb_request *sr, char *str)
889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (sr->smb_flg2 & SMB_FLAGS2_UNICODE)
909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (smb_wcequiv_strlen(str) + 2);
919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (strlen(str) + 1);
929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int
959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_ascii_or_unicode_null_len(struct smb_request *sr)
969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (sr->smb_flg2 & SMB_FLAGS2_UNICODE)
989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (2);
999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (1);
1009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
1019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
1039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
104*c13be35aSGordon Ross  * Convert old-style (DOS, LanMan) wildcard strings to NT style.
105*c13be35aSGordon Ross  * This should ONLY happen to patterns that come from old clients,
106*c13be35aSGordon Ross  * meaning dialect LANMAN2_1 etc. (dialect < NT_LM_0_12).
1079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
1089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *	? is converted to >
1099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *	* is converted to < if it is followed by .
110*c13be35aSGordon Ross  *	. is converted to " if it is followed by ? or * or end of pattern
1119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
112*c13be35aSGordon Ross  * Note: modifies pattern in place.
1139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
1149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
1159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_convert_wildcards(char *pattern)
1169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
1179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	char	*p;
1189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
119*c13be35aSGordon Ross 	for (p = pattern; *p != '\0'; p++) {
1209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		switch (*p) {
121*c13be35aSGordon Ross 		case '?':
122*c13be35aSGordon Ross 			*p = '>';
1239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			break;
124*c13be35aSGordon Ross 		case '*':
125*c13be35aSGordon Ross 			if (p[1] == '.')
126*c13be35aSGordon Ross 				*p = '<';
1279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			break;
128*c13be35aSGordon Ross 		case '.':
129*c13be35aSGordon Ross 			if (p[1] == '?' || p[1] == '*' || p[1] == '\0')
130*c13be35aSGordon Ross 				*p = '\"';
1319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			break;
1329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
1339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
1349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
1359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
1379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_sattr_check
1389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
1399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Check file attributes against a search attribute (sattr) mask.
1409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
1419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Normal files, which includes READONLY and ARCHIVE, always pass
1429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * this check.  If the DIRECTORY, HIDDEN or SYSTEM special attributes
1439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * are set then they must appear in the search mask.  The special
1449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * attributes are inclusive, i.e. all special attributes that appear
1459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * in sattr must also appear in the file attributes for the check to
1469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * pass.
1479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
1489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * The following examples show how this works:
1499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
1509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *		fileA:	READONLY
1519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *		fileB:	0 (no attributes = normal file)
1529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *		fileC:	READONLY, ARCHIVE
1539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *		fileD:	HIDDEN
1549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *		fileE:	READONLY, HIDDEN, SYSTEM
1559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *		dirA:	DIRECTORY
1569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
1579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * search attribute: 0
1589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *		Returns: fileA, fileB and fileC.
1599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * search attribute: HIDDEN
1609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *		Returns: fileA, fileB, fileC and fileD.
1619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * search attribute: SYSTEM
1629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *		Returns: fileA, fileB and fileC.
1639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * search attribute: DIRECTORY
1649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *		Returns: fileA, fileB, fileC and dirA.
1659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * search attribute: HIDDEN and SYSTEM
1669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *		Returns: fileA, fileB, fileC, fileD and fileE.
1679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
1689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Returns true if the file and sattr match; otherwise, returns false.
1699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
1709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States boolean_t
1719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_sattr_check(uint16_t dosattr, uint16_t sattr)
1729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
1739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((dosattr & FILE_ATTRIBUTE_DIRECTORY) &&
1749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    !(sattr & FILE_ATTRIBUTE_DIRECTORY))
1759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (B_FALSE);
1769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((dosattr & FILE_ATTRIBUTE_HIDDEN) &&
1789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    !(sattr & FILE_ATTRIBUTE_HIDDEN))
1799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (B_FALSE);
1809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((dosattr & FILE_ATTRIBUTE_SYSTEM) &&
1829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    !(sattr & FILE_ATTRIBUTE_SYSTEM))
1839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (B_FALSE);
1849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (B_TRUE);
1869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
1879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int
1899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States microtime(timestruc_t *tvp)
1909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
1919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	tvp->tv_sec = gethrestime_sec();
1929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	tvp->tv_nsec = 0;
1939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (0);
1949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
1959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int32_t
1979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States clock_get_milli_uptime()
1989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
1999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (TICK_TO_MSEC(ddi_get_lbolt()));
2009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
2019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int /*ARGSUSED*/
2039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_noop(void *p, size_t size, int foo)
2049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
2059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (0);
2069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
2079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
2099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_idpool_increment
2109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
2119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * This function increments the ID pool by doubling the current size. This
2129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * function assumes the caller entered the mutex of the pool.
2139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
2149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
2159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_idpool_increment(
2169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_idpool_t	*pool)
2179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
2189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint8_t		*new_pool;
2199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t	new_size;
2209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(pool->id_magic == SMB_IDPOOL_MAGIC);
2229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	new_size = pool->id_size * 2;
2249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (new_size <= SMB_IDPOOL_MAX_SIZE) {
2259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		new_pool = kmem_alloc(new_size / 8, KM_NOSLEEP);
2269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (new_pool) {
2279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			bzero(new_pool, new_size / 8);
2289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			bcopy(pool->id_pool, new_pool, pool->id_size / 8);
2299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			kmem_free(pool->id_pool, pool->id_size / 8);
2309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			pool->id_pool = new_pool;
2319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			pool->id_free_counter += new_size - pool->id_size;
2329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			pool->id_max_free_counter += new_size - pool->id_size;
2339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			pool->id_size = new_size;
2349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			pool->id_idx_msk = (new_size / 8) - 1;
2359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			if (new_size >= SMB_IDPOOL_MAX_SIZE) {
2369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 				/* id -1 made unavailable */
2379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 				pool->id_pool[pool->id_idx_msk] = 0x80;
2389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 				pool->id_free_counter--;
2399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 				pool->id_max_free_counter--;
2409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			}
2419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			return (0);
2429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
2439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
2449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (-1);
2459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
2469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
2489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_idpool_constructor
2499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
2509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * This function initializes the pool structure provided.
2519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
2529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int
2539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_idpool_constructor(
2549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_idpool_t	*pool)
2559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
2569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(pool->id_magic != SMB_IDPOOL_MAGIC);
2589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	pool->id_size = SMB_IDPOOL_MIN_SIZE;
2609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	pool->id_idx_msk = (SMB_IDPOOL_MIN_SIZE / 8) - 1;
2619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	pool->id_free_counter = SMB_IDPOOL_MIN_SIZE - 1;
2629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	pool->id_max_free_counter = SMB_IDPOOL_MIN_SIZE - 1;
2639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	pool->id_bit = 0x02;
2649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	pool->id_bit_idx = 1;
2659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	pool->id_idx = 0;
2669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	pool->id_pool = (uint8_t *)kmem_alloc((SMB_IDPOOL_MIN_SIZE / 8),
2679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    KM_SLEEP);
2689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(pool->id_pool, (SMB_IDPOOL_MIN_SIZE / 8));
2699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	/* -1 id made unavailable */
2709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	pool->id_pool[0] = 0x01;		/* id 0 made unavailable */
2719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_init(&pool->id_mutex, NULL, MUTEX_DEFAULT, NULL);
2729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	pool->id_magic = SMB_IDPOOL_MAGIC;
2739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (0);
2749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
2759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
2779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_idpool_destructor
2789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
2799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * This function tears down and frees the resources associated with the
2809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * pool provided.
2819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
2829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
2839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_idpool_destructor(
2849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_idpool_t	*pool)
2859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
2869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(pool->id_magic == SMB_IDPOOL_MAGIC);
2879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(pool->id_free_counter == pool->id_max_free_counter);
2889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	pool->id_magic = (uint32_t)~SMB_IDPOOL_MAGIC;
2899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_destroy(&pool->id_mutex);
2909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	kmem_free(pool->id_pool, (size_t)(pool->id_size / 8));
2919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
2929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
2949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_idpool_alloc
2959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
2969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * This function allocates an ID from the pool provided.
2979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
2989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int
2999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_idpool_alloc(
3009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_idpool_t	*pool,
3019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     uint16_t		*id)
3029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
3039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t	i;
3049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint8_t		bit;
3059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint8_t		bit_idx;
3069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint8_t		byte;
3079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(pool->id_magic == SMB_IDPOOL_MAGIC);
3099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_enter(&pool->id_mutex);
3119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((pool->id_free_counter == 0) && smb_idpool_increment(pool)) {
3129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		mutex_exit(&pool->id_mutex);
3139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (-1);
3149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
3159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	i = pool->id_size;
3179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	while (i) {
3189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		bit = pool->id_bit;
3199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		bit_idx = pool->id_bit_idx;
3209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		byte = pool->id_pool[pool->id_idx];
3219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		while (bit) {
3229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			if (byte & bit) {
3239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 				bit = bit << 1;
3249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 				bit_idx++;
3259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 				continue;
3269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			}
3279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			pool->id_pool[pool->id_idx] |= bit;
3289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			*id = (uint16_t)(pool->id_idx * 8 + (uint32_t)bit_idx);
3299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			pool->id_free_counter--;
3309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			pool->id_bit = bit;
3319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			pool->id_bit_idx = bit_idx;
3329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			mutex_exit(&pool->id_mutex);
3339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			return (0);
3349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
3359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		pool->id_bit = 1;
3369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		pool->id_bit_idx = 0;
3379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		pool->id_idx++;
3389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		pool->id_idx &= pool->id_idx_msk;
3399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		--i;
3409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
3419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	/*
3429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	 * This section of code shouldn't be reached. If there are IDs
3439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	 * available and none could be found there's a problem.
3449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	 */
3459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(0);
3469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_exit(&pool->id_mutex);
3479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (-1);
3489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
3499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
3519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_idpool_free
3529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
3539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * This function frees the ID provided.
3549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
3559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
3569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_idpool_free(
3579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_idpool_t	*pool,
3589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     uint16_t		id)
3599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
3609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(pool->id_magic == SMB_IDPOOL_MAGIC);
3619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(id != 0);
3629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(id != 0xFFFF);
3639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_enter(&pool->id_mutex);
3659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (pool->id_pool[id >> 3] & (1 << (id & 7))) {
3669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		pool->id_pool[id >> 3] &= ~(1 << (id & 7));
3679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		pool->id_free_counter++;
3689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		ASSERT(pool->id_free_counter <= pool->id_max_free_counter);
3699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		mutex_exit(&pool->id_mutex);
3709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return;
3719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
3729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	/* Freeing a free ID. */
3739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(0);
3749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_exit(&pool->id_mutex);
3759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
3769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
3789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Initialize the llist delete queue object cache.
3799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
3809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
3819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_init(void)
3829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
3839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_llist_initialized)
3849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return;
3859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_dtor_cache = kmem_cache_create("smb_dtor_cache",
3879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    sizeof (smb_dtor_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
3889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_llist_initialized = B_TRUE;
3909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
3919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
3939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Destroy the llist delete queue object cache.
3949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
3959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
3969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_fini(void)
3979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
3989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (!smb_llist_initialized)
3999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return;
4009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	kmem_cache_destroy(smb_dtor_cache);
4029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_llist_initialized = B_FALSE;
4039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
4049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
4069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_llist_constructor
4079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
4089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * This function initializes a locked list.
4099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
4109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
4119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_constructor(
4129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_llist_t	*ll,
4139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     size_t	size,
4149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     size_t	offset)
4159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
4169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	rw_init(&ll->ll_lock, NULL, RW_DEFAULT, NULL);
4179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_init(&ll->ll_mutex, NULL, MUTEX_DEFAULT, NULL);
4189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_create(&ll->ll_list, size, offset);
4199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_create(&ll->ll_deleteq, sizeof (smb_dtor_t),
4209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    offsetof(smb_dtor_t, dt_lnd));
4219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ll->ll_count = 0;
4229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ll->ll_wrop = 0;
4239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ll->ll_deleteq_count = 0;
424cb174861Sjoyce mcintosh 	ll->ll_flushing = B_FALSE;
4259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
4269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
4289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Flush the delete queue and destroy a locked list.
4299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
4309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
4319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_destructor(
4329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_llist_t	*ll)
4339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
4349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_llist_flush(ll);
4359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(ll->ll_count == 0);
4379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(ll->ll_deleteq_count == 0);
4389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	rw_destroy(&ll->ll_lock);
4409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_destroy(&ll->ll_list);
4419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_destroy(&ll->ll_deleteq);
4429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_destroy(&ll->ll_mutex);
4439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
4449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
4469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Post an object to the delete queue.  The delete queue will be processed
4479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * during list exit or list destruction.  Objects are often posted for
4489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * deletion during list iteration (while the list is locked) but that is
4499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * not required, and an object can be posted at any time.
4509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
4519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
4529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_post(smb_llist_t *ll, void *object, smb_dtorproc_t dtorproc)
4539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
4549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_dtor_t	*dtor;
4559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT((object != NULL) && (dtorproc != NULL));
4579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	dtor = kmem_cache_alloc(smb_dtor_cache, KM_SLEEP);
4599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(dtor, sizeof (smb_dtor_t));
4609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	dtor->dt_magic = SMB_DTOR_MAGIC;
4619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	dtor->dt_object = object;
4629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	dtor->dt_proc = dtorproc;
4639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_enter(&ll->ll_mutex);
4659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_insert_tail(&ll->ll_deleteq, dtor);
4669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	++ll->ll_deleteq_count;
4679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_exit(&ll->ll_mutex);
4689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
4699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
4719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Exit the list lock and process the delete queue.
4729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
4739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
4749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_exit(smb_llist_t *ll)
4759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
4769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	rw_exit(&ll->ll_lock);
4779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_llist_flush(ll);
4789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
4799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
4819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Flush the list delete queue.  The mutex is dropped across the destructor
4829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * call in case this leads to additional objects being posted to the delete
4839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * queue.
4849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
485c5866007SKeyur Desai void
4869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_flush(smb_llist_t *ll)
4879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
4889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_dtor_t    *dtor;
4899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_enter(&ll->ll_mutex);
491cb174861Sjoyce mcintosh 	if (ll->ll_flushing) {
492cb174861Sjoyce mcintosh 		mutex_exit(&ll->ll_mutex);
493cb174861Sjoyce mcintosh 		return;
494cb174861Sjoyce mcintosh 	}
495cb174861Sjoyce mcintosh 	ll->ll_flushing = B_TRUE;
4969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	dtor = list_head(&ll->ll_deleteq);
4989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	while (dtor != NULL) {
4999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		SMB_DTOR_VALID(dtor);
5009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		ASSERT((dtor->dt_object != NULL) && (dtor->dt_proc != NULL));
5019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		list_remove(&ll->ll_deleteq, dtor);
5029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		--ll->ll_deleteq_count;
5039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		mutex_exit(&ll->ll_mutex);
5049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		dtor->dt_proc(dtor->dt_object);
5069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		dtor->dt_magic = (uint32_t)~SMB_DTOR_MAGIC;
5089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		kmem_cache_free(smb_dtor_cache, dtor);
5099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		mutex_enter(&ll->ll_mutex);
5109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		dtor = list_head(&ll->ll_deleteq);
5119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
512cb174861Sjoyce mcintosh 	ll->ll_flushing = B_FALSE;
5139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_exit(&ll->ll_mutex);
5159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
5169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
5189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_llist_upgrade
5199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
5209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * This function tries to upgrade the lock of the locked list. It assumes the
5219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * locked has already been entered in RW_READER mode. It first tries using the
5229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Solaris function rw_tryupgrade(). If that call fails the lock is released
5239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * and reentered in RW_WRITER mode. In that last case a window is opened during
5249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * which the contents of the list may have changed. The return code indicates
5259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * whether or not the list was modified when the lock was exited.
5269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
5279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int smb_llist_upgrade(
5289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_llist_t *ll)
5299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
5309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint64_t	wrop;
5319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (rw_tryupgrade(&ll->ll_lock) != 0) {
5339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (0);
5349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
5359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	wrop = ll->ll_wrop;
5369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	rw_exit(&ll->ll_lock);
5379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	rw_enter(&ll->ll_lock, RW_WRITER);
5389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (wrop != ll->ll_wrop);
5399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
5409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
5429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_llist_insert_head
5439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
5449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * This function inserts the object passed a the beginning of the list. This
5459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * function assumes the lock of the list has already been entered.
5469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
5479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
5489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_insert_head(
5499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_llist_t	*ll,
5509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     void	*obj)
5519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
5529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_insert_head(&ll->ll_list, obj);
5539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	++ll->ll_wrop;
5549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	++ll->ll_count;
5559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
5569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
5589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_llist_insert_tail
5599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
5609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * This function appends to the object passed to the list. This function assumes
5619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * the lock of the list has already been entered.
5629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
5639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
5649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
5659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_insert_tail(
5669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_llist_t	*ll,
5679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     void	*obj)
5689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
5699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_insert_tail(&ll->ll_list, obj);
5709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	++ll->ll_wrop;
5719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	++ll->ll_count;
5729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
5739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
5759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_llist_remove
5769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
5779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * This function removes the object passed from the list. This function assumes
5789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * the lock of the list has already been entered.
5799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
5809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
5819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_remove(
5829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_llist_t	*ll,
5839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     void	*obj)
5849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
5859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_remove(&ll->ll_list, obj);
5869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	++ll->ll_wrop;
5879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	--ll->ll_count;
5889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
5899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
5919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_llist_get_count
5929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
5939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * This function returns the number of elements in the specified list.
5949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
5959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t
5969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_get_count(
5979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_llist_t *ll)
5989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
5999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (ll->ll_count);
6009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
6019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
6039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_slist_constructor
6049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
6059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Synchronized list constructor.
6069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
6079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
6089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_slist_constructor(
6099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_slist_t	*sl,
6109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     size_t	size,
6119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     size_t	offset)
6129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
6139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_init(&sl->sl_mutex, NULL, MUTEX_DEFAULT, NULL);
6149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	cv_init(&sl->sl_cv, NULL, CV_DEFAULT, NULL);
6159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_create(&sl->sl_list, size, offset);
6169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	sl->sl_count = 0;
6179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	sl->sl_waiting = B_FALSE;
6189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
6199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
6219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_slist_destructor
6229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
6239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Synchronized list destructor.
6249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
6259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
6269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_slist_destructor(
6279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_slist_t	*sl)
6289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
629148c5f43SAlan Wright 	VERIFY(sl->sl_count == 0);
6309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_destroy(&sl->sl_mutex);
6329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	cv_destroy(&sl->sl_cv);
6339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_destroy(&sl->sl_list);
6349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
6359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
6379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_slist_insert_head
6389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
6399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * This function inserts the object passed a the beginning of the list.
6409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
6419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
6429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_slist_insert_head(
6439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_slist_t	*sl,
6449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     void	*obj)
6459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
6469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_enter(&sl->sl_mutex);
6479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_insert_head(&sl->sl_list, obj);
6489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	++sl->sl_count;
6499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_exit(&sl->sl_mutex);
6509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
6519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
6539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_slist_insert_tail
6549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
6559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * This function appends the object passed to the list.
6569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
6579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
6589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_slist_insert_tail(
6599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_slist_t	*sl,
6609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     void	*obj)
6619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
6629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_enter(&sl->sl_mutex);
6639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_insert_tail(&sl->sl_list, obj);
6649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	++sl->sl_count;
6659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_exit(&sl->sl_mutex);
6669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
6679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
6699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_llist_remove
6709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
6719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * This function removes the object passed by the caller from the list.
6729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
6739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
6749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_slist_remove(
6759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_slist_t	*sl,
6769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     void	*obj)
6779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
6789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_enter(&sl->sl_mutex);
6799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_remove(&sl->sl_list, obj);
6809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((--sl->sl_count == 0) && (sl->sl_waiting)) {
6819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		sl->sl_waiting = B_FALSE;
6829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		cv_broadcast(&sl->sl_cv);
6839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
6849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_exit(&sl->sl_mutex);
6859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
6869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
6889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_slist_move_tail
6899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
6909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * This function transfers all the contents of the synchronized list to the
6919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * list_t provided. It returns the number of objects transferred.
6929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
6939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t
6949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_slist_move_tail(
6959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     list_t	*lst,
6969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_slist_t	*sl)
6979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
6989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t	rv;
6999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_enter(&sl->sl_mutex);
7019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	rv = sl->sl_count;
7029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (sl->sl_count) {
7039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		list_move_tail(lst, &sl->sl_list);
7049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		sl->sl_count = 0;
7059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (sl->sl_waiting) {
7069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			sl->sl_waiting = B_FALSE;
7079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			cv_broadcast(&sl->sl_cv);
7089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
7099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
7109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_exit(&sl->sl_mutex);
7119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (rv);
7129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
7139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
7159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_slist_obj_move
7169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
7179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * This function moves an object from one list to the end of the other list. It
7189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * assumes the mutex of each list has been entered.
7199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
7209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
7219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_slist_obj_move(
7229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_slist_t	*dst,
7239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_slist_t	*src,
7249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     void	*obj)
7259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
7269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(dst->sl_list.list_offset == src->sl_list.list_offset);
7279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(dst->sl_list.list_size == src->sl_list.list_size);
7289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_remove(&src->sl_list, obj);
7309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_insert_tail(&dst->sl_list, obj);
7319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	dst->sl_count++;
7329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	src->sl_count--;
7339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((src->sl_count == 0) && (src->sl_waiting)) {
7349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		src->sl_waiting = B_FALSE;
7359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		cv_broadcast(&src->sl_cv);
7369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
7379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
7389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
7409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_slist_wait_for_empty
7419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
7429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * This function waits for a list to be emptied.
7439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
7449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
7459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_slist_wait_for_empty(
7469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_slist_t	*sl)
7479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
7489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_enter(&sl->sl_mutex);
7499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	while (sl->sl_count) {
7509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		sl->sl_waiting = B_TRUE;
7519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		cv_wait(&sl->sl_cv, &sl->sl_mutex);
7529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
7539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_exit(&sl->sl_mutex);
7549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
7559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
7579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_slist_exit
7589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
7599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * This function exits the muetx of the list and signal the condition variable
7609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * if the list is empty.
7619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
7629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
7639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_slist_exit(smb_slist_t *sl)
7649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
7659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((sl->sl_count == 0) && (sl->sl_waiting)) {
7669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		sl->sl_waiting = B_FALSE;
7679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		cv_broadcast(&sl->sl_cv);
7689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
7699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_exit(&sl->sl_mutex);
7709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
7719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
7739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_thread_entry_point
7749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
7759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Common entry point for all the threads created through smb_thread_start.
7769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * The state of the thread is set to "running" at the beginning and moved to
7779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * "exiting" just before calling thread_exit(). The condition variable is
7789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *  also signaled.
7799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
7809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void
7819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_thread_entry_point(
7829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_thread_t	*thread)
7839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
7849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(thread->sth_magic == SMB_THREAD_MAGIC);
7859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_enter(&thread->sth_mtx);
7869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(thread->sth_state == SMB_THREAD_STATE_STARTING);
7879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	thread->sth_th = curthread;
7889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	thread->sth_did = thread->sth_th->t_did;
7899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (!thread->sth_kill) {
7919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		thread->sth_state = SMB_THREAD_STATE_RUNNING;
7929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		cv_signal(&thread->sth_cv);
7939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		mutex_exit(&thread->sth_mtx);
7949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		thread->sth_ep(thread, thread->sth_ep_arg);
7959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		mutex_enter(&thread->sth_mtx);
7969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
7979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	thread->sth_th = NULL;
7989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	thread->sth_state = SMB_THREAD_STATE_EXITING;
7999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	cv_broadcast(&thread->sth_cv);
8009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_exit(&thread->sth_mtx);
8019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	thread_exit();
8029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
8039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
8059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_thread_init
8069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
8079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
8089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_thread_init(
8099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_thread_t	*thread,
8109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     char		*name,
8119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_thread_ep_t	ep,
8124163af6aSjose borrego     void		*ep_arg)
8139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
8149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(thread->sth_magic != SMB_THREAD_MAGIC);
8159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(thread, sizeof (*thread));
8179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) strlcpy(thread->sth_name, name, sizeof (thread->sth_name));
8199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	thread->sth_ep = ep;
8209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	thread->sth_ep_arg = ep_arg;
8219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	thread->sth_state = SMB_THREAD_STATE_EXITED;
8229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_init(&thread->sth_mtx, NULL, MUTEX_DEFAULT, NULL);
8239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	cv_init(&thread->sth_cv, NULL, CV_DEFAULT, NULL);
8249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	thread->sth_magic = SMB_THREAD_MAGIC;
8259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
8269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
8289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_thread_destroy
8299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
8309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
8319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_thread_destroy(
8329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_thread_t	*thread)
8339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
8349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(thread->sth_magic == SMB_THREAD_MAGIC);
8359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(thread->sth_state == SMB_THREAD_STATE_EXITED);
8369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	thread->sth_magic = 0;
8379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_destroy(&thread->sth_mtx);
8389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	cv_destroy(&thread->sth_cv);
8399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
8409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
8429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_thread_start
8439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
8449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * This function starts a thread with the parameters provided. It waits until
8459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * the state of the thread has been moved to running.
8469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
8479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*ARGSUSED*/
8489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int
8499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_thread_start(
8509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_thread_t	*thread)
8519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
8529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int		rc = 0;
8539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	kthread_t	*tmpthread;
8549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(thread->sth_magic == SMB_THREAD_MAGIC);
8569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_enter(&thread->sth_mtx);
8589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	switch (thread->sth_state) {
8599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_THREAD_STATE_EXITED:
8609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		thread->sth_state = SMB_THREAD_STATE_STARTING;
8619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		mutex_exit(&thread->sth_mtx);
8629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		tmpthread = thread_create(NULL, 0, smb_thread_entry_point,
8639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    thread, 0, &p0, TS_RUN, minclsyspri);
8649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		ASSERT(tmpthread != NULL);
8659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		mutex_enter(&thread->sth_mtx);
8669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		while (thread->sth_state == SMB_THREAD_STATE_STARTING)
8679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			cv_wait(&thread->sth_cv, &thread->sth_mtx);
8689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (thread->sth_state != SMB_THREAD_STATE_RUNNING)
8699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			rc = -1;
8709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		break;
8719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	default:
8729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		ASSERT(0);
8739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		rc = -1;
8749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		break;
8759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
8769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_exit(&thread->sth_mtx);
8779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (rc);
8789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
8799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
8819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_thread_stop
8829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
8839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * This function signals a thread to kill itself and waits until the "exiting"
8849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * state has been reached.
8859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
8869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
8874163af6aSjose borrego smb_thread_stop(smb_thread_t *thread)
8889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
8899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(thread->sth_magic == SMB_THREAD_MAGIC);
8909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
8919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_enter(&thread->sth_mtx);
8929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	switch (thread->sth_state) {
8939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_THREAD_STATE_RUNNING:
8949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_THREAD_STATE_STARTING:
8959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (!thread->sth_kill) {
8969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			thread->sth_kill = B_TRUE;
8979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			cv_broadcast(&thread->sth_cv);
8989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			while (thread->sth_state != SMB_THREAD_STATE_EXITING)
8999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 				cv_wait(&thread->sth_cv, &thread->sth_mtx);
9009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			mutex_exit(&thread->sth_mtx);
9019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			thread_join(thread->sth_did);
9029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			mutex_enter(&thread->sth_mtx);
9039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			thread->sth_state = SMB_THREAD_STATE_EXITED;
9049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			thread->sth_did = 0;
9059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			thread->sth_kill = B_FALSE;
9069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			cv_broadcast(&thread->sth_cv);
9079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			break;
9089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
9099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		/*FALLTHRU*/
9109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_THREAD_STATE_EXITING:
9129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (thread->sth_kill) {
9139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			while (thread->sth_state != SMB_THREAD_STATE_EXITED)
9149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 				cv_wait(&thread->sth_cv, &thread->sth_mtx);
9159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
9169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			thread->sth_state = SMB_THREAD_STATE_EXITED;
9179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			thread->sth_did = 0;
9189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
9199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		break;
9209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_THREAD_STATE_EXITED:
9229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		break;
9239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	default:
9259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		ASSERT(0);
9269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		break;
9279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
9289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_exit(&thread->sth_mtx);
9299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
9309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
9329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_thread_signal
9339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
9349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * This function signals a thread.
9359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
9369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
9374163af6aSjose borrego smb_thread_signal(smb_thread_t *thread)
9389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
9399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(thread->sth_magic == SMB_THREAD_MAGIC);
9409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_enter(&thread->sth_mtx);
9429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	switch (thread->sth_state) {
9439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_THREAD_STATE_RUNNING:
9449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		cv_signal(&thread->sth_cv);
9459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		break;
9469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	default:
9489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		break;
9499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
9509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_exit(&thread->sth_mtx);
9519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
9529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States boolean_t
9549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_thread_continue(smb_thread_t *thread)
9559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
9569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	boolean_t result;
9579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(thread->sth_magic == SMB_THREAD_MAGIC);
9599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_enter(&thread->sth_mtx);
9619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	result = smb_thread_continue_timedwait_locked(thread, 0);
9629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_exit(&thread->sth_mtx);
9639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (result);
9659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
9669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States boolean_t
9689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_thread_continue_nowait(smb_thread_t *thread)
9699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
9709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	boolean_t result;
9719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(thread->sth_magic == SMB_THREAD_MAGIC);
9739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_enter(&thread->sth_mtx);
9759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	/*
9769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	 * Setting ticks=-1 requests a non-blocking check.  We will
9779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	 * still block if the thread is in "suspend" state.
9789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	 */
9799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	result = smb_thread_continue_timedwait_locked(thread, -1);
9809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_exit(&thread->sth_mtx);
9819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (result);
9839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
9849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States boolean_t
9869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_thread_continue_timedwait(smb_thread_t *thread, int seconds)
9879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
9889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	boolean_t result;
9899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(thread->sth_magic == SMB_THREAD_MAGIC);
9919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_enter(&thread->sth_mtx);
9939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	result = smb_thread_continue_timedwait_locked(thread,
9949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    SEC_TO_TICK(seconds));
9959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_exit(&thread->sth_mtx);
9969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
9979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (result);
9989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
9999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
10009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
10019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_thread_continue_timedwait_locked
10029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
10039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Internal only.  Ticks==-1 means don't block, Ticks == 0 means wait
10049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * indefinitely
10059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
10069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static boolean_t
10079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_thread_continue_timedwait_locked(smb_thread_t *thread, int ticks)
10089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
10099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	boolean_t	result;
10109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
10119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	/* -1 means don't block */
10129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (ticks != -1 && !thread->sth_kill) {
10139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (ticks == 0) {
10149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			cv_wait(&thread->sth_cv, &thread->sth_mtx);
10159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
10169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			(void) cv_reltimedwait(&thread->sth_cv,
10179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			    &thread->sth_mtx, (clock_t)ticks, TR_CLOCK_TICK);
10189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
10199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
10209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	result = (thread->sth_kill == 0);
10219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
10229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (result);
10239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
10249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
10259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
10269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_rwx_init
10279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
10289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
10299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_rwx_init(
10309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_rwx_t	*rwx)
10319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
10329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(rwx, sizeof (smb_rwx_t));
10339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	cv_init(&rwx->rwx_cv, NULL, CV_DEFAULT, NULL);
10349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_init(&rwx->rwx_mutex, NULL, MUTEX_DEFAULT, NULL);
10359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	rw_init(&rwx->rwx_lock, NULL, RW_DEFAULT, NULL);
10369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
10379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
10389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
10399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_rwx_destroy
10409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
10419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
10429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_rwx_destroy(
10439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_rwx_t	*rwx)
10449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
10459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_destroy(&rwx->rwx_mutex);
10469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	cv_destroy(&rwx->rwx_cv);
10479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	rw_destroy(&rwx->rwx_lock);
10489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
10499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
10509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
10519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_rwx_rwexit
10529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
10539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
10549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_rwx_rwexit(
10559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_rwx_t	*rwx)
10569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
10579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (rw_write_held(&rwx->rwx_lock)) {
10589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		ASSERT(rw_owner(&rwx->rwx_lock) == curthread);
10599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		mutex_enter(&rwx->rwx_mutex);
10609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (rwx->rwx_waiting) {
10619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			rwx->rwx_waiting = B_FALSE;
10629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			cv_broadcast(&rwx->rwx_cv);
10639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
10649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		mutex_exit(&rwx->rwx_mutex);
10659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
10669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	rw_exit(&rwx->rwx_lock);
10679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
10689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
10699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
10709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_rwx_rwupgrade
10719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
10729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States krw_t
10739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_rwx_rwupgrade(
10749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_rwx_t	*rwx)
10759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
10769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (rw_write_held(&rwx->rwx_lock)) {
10779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		ASSERT(rw_owner(&rwx->rwx_lock) == curthread);
10789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (RW_WRITER);
10799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
10809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (!rw_tryupgrade(&rwx->rwx_lock)) {
10819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		rw_exit(&rwx->rwx_lock);
10829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		rw_enter(&rwx->rwx_lock, RW_WRITER);
10839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
10849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (RW_READER);
10859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
10869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
10879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
10889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_rwx_rwrestore
10899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
10909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
10919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_rwx_rwdowngrade(
10929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_rwx_t	*rwx,
10939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     krw_t	mode)
10949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
10959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(rw_write_held(&rwx->rwx_lock));
10969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(rw_owner(&rwx->rwx_lock) == curthread);
10979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
10989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (mode == RW_WRITER) {
10999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return;
11009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
11019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(mode == RW_READER);
11029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_enter(&rwx->rwx_mutex);
11039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (rwx->rwx_waiting) {
11049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		rwx->rwx_waiting = B_FALSE;
11059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		cv_broadcast(&rwx->rwx_cv);
11069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
11079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_exit(&rwx->rwx_mutex);
11089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	rw_downgrade(&rwx->rwx_lock);
11099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
11109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
11119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
11129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_rwx_wait
11139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
11149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * This function assumes the smb_rwx lock was enter in RW_READER or RW_WRITER
11159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * mode. It will:
11169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
11179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *	1) release the lock and save its current mode.
11189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *	2) wait until the condition variable is signaled. This can happen for
11199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *	   2 reasons: When a writer releases the lock or when the time out (if
11209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *	   provided) expires.
11219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *	3) re-acquire the lock in the mode saved in (1).
11229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
11239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int
11249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_rwx_rwwait(
11259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_rwx_t	*rwx,
11269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     clock_t	timeout)
11279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
11289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int	rc;
11299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	krw_t	mode;
11309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
11319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_enter(&rwx->rwx_mutex);
11329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	rwx->rwx_waiting = B_TRUE;
11339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_exit(&rwx->rwx_mutex);
11349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
11359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (rw_write_held(&rwx->rwx_lock)) {
11369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		ASSERT(rw_owner(&rwx->rwx_lock) == curthread);
11379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		mode = RW_WRITER;
11389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	} else {
11399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		ASSERT(rw_read_held(&rwx->rwx_lock));
11409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		mode = RW_READER;
11419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
11429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	rw_exit(&rwx->rwx_lock);
11439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
11449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_enter(&rwx->rwx_mutex);
11459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (rwx->rwx_waiting) {
11469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (timeout == -1) {
11479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			rc = 1;
11489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			cv_wait(&rwx->rwx_cv, &rwx->rwx_mutex);
11499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
11509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			rc = cv_reltimedwait(&rwx->rwx_cv, &rwx->rwx_mutex,
11519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			    timeout, TR_CLOCK_TICK);
11529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
11539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
11549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	mutex_exit(&rwx->rwx_mutex);
11559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
11569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	rw_enter(&rwx->rwx_lock, mode);
11579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (rc);
11589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
11599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
11609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
11619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * SMB ID mapping
11629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
11639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Solaris ID mapping service (aka Winchester) works with domain SIDs
11649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * and RIDs where domain SIDs are in string format. CIFS service works
11659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * with binary SIDs understandable by CIFS clients. A layer of SMB ID
11669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * mapping functions are implemeted to hide the SID conversion details
11679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * and also hide the handling of array of batch mapping requests.
11689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
11699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * IMPORTANT NOTE The Winchester API requires a zone. Because CIFS server
11709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * currently only runs in the global zone the global zone is specified.
11719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * This needs to be fixed when the CIFS server supports zones.
11729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
11739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
11749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smb_idmap_batch_binsid(smb_idmap_batch_t *sib);
11759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
11769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
11779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_idmap_getid
11789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
11799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Maps the given Windows SID to a Solaris ID using the
11809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * simple mapping API.
11819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
11829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States idmap_stat
11839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_idmap_getid(smb_sid_t *sid, uid_t *id, int *idtype)
11849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
11859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_idmap_t sim;
11869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	char sidstr[SMB_SID_STRSZ];
11879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
11889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_sid_tostr(sid, sidstr);
11899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_sid_splitstr(sidstr, &sim.sim_rid) != 0)
11909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (IDMAP_ERR_SID);
11919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	sim.sim_domsid = sidstr;
11929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	sim.sim_id = id;
11939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
11949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	switch (*idtype) {
11959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_IDMAP_USER:
11969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		sim.sim_stat = kidmap_getuidbysid(global_zone, sim.sim_domsid,
11979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    sim.sim_rid, sim.sim_id);
11989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		break;
11999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
12009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_IDMAP_GROUP:
12019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		sim.sim_stat = kidmap_getgidbysid(global_zone, sim.sim_domsid,
12029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    sim.sim_rid, sim.sim_id);
12039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		break;
12049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
12059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_IDMAP_UNKNOWN:
12069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		sim.sim_stat = kidmap_getpidbysid(global_zone, sim.sim_domsid,
12079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    sim.sim_rid, sim.sim_id, &sim.sim_idtype);
12089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		break;
12099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
12109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	default:
12119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		ASSERT(0);
12129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (IDMAP_ERR_ARG);
12139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
12149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
12159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	*idtype = sim.sim_idtype;
12169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
12179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (sim.sim_stat);
12189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
12199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
12209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
12219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_idmap_getsid
12229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
12239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Maps the given Solaris ID to a Windows SID using the
12249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * simple mapping API.
12259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
12269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States idmap_stat
12279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_idmap_getsid(uid_t id, int idtype, smb_sid_t **sid)
12289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
12299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_idmap_t sim;
12309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
12319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	switch (idtype) {
12329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_IDMAP_USER:
12339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		sim.sim_stat = kidmap_getsidbyuid(global_zone, id,
12349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    (const char **)&sim.sim_domsid, &sim.sim_rid);
12359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		break;
12369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
12379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_IDMAP_GROUP:
12389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		sim.sim_stat = kidmap_getsidbygid(global_zone, id,
12399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    (const char **)&sim.sim_domsid, &sim.sim_rid);
12409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		break;
12419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
12429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_IDMAP_EVERYONE:
12439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		/* Everyone S-1-1-0 */
12449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		sim.sim_domsid = "S-1-1";
12459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		sim.sim_rid = 0;
12469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		sim.sim_stat = IDMAP_SUCCESS;
12479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		break;
12489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
12499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	default:
12509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		ASSERT(0);
12519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (IDMAP_ERR_ARG);
12529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
12539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
12549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (sim.sim_stat != IDMAP_SUCCESS)
12559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (sim.sim_stat);
12569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
12579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (sim.sim_domsid == NULL)
12589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (IDMAP_ERR_NOMAPPING);
12599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
12609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	sim.sim_sid = smb_sid_fromstr(sim.sim_domsid);
12619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (sim.sim_sid == NULL)
12629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (IDMAP_ERR_INTERNAL);
12639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
12649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	*sid = smb_sid_splice(sim.sim_sid, sim.sim_rid);
12659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_sid_free(sim.sim_sid);
12669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (*sid == NULL)
12679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		sim.sim_stat = IDMAP_ERR_INTERNAL;
12689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
12699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (sim.sim_stat);
12709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
12719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
12729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
12739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_idmap_batch_create
12749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
12759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Creates and initializes the context for batch ID mapping.
12769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
12779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States idmap_stat
12789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_idmap_batch_create(smb_idmap_batch_t *sib, uint16_t nmap, int flags)
12799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
12809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(sib);
12819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
12829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(sib, sizeof (smb_idmap_batch_t));
12839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
12849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	sib->sib_idmaph = kidmap_get_create(global_zone);
12859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
12869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	sib->sib_flags = flags;
12879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	sib->sib_nmap = nmap;
12889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	sib->sib_size = nmap * sizeof (smb_idmap_t);
12899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	sib->sib_maps = kmem_zalloc(sib->sib_size, KM_SLEEP);
12909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
12919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (IDMAP_SUCCESS);
12929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
12939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
12949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
12959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_idmap_batch_destroy
12969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
12979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Frees the batch ID mapping context.
12989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * If ID mapping is Solaris -> Windows it frees memories
12999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * allocated for binary SIDs.
13009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
13019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
13029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_idmap_batch_destroy(smb_idmap_batch_t *sib)
13039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
13049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	char *domsid;
13059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int i;
13069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
13079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(sib);
13089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(sib->sib_maps);
13099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
13109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (sib->sib_idmaph)
13119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		kidmap_get_destroy(sib->sib_idmaph);
13129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
13139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (sib->sib_flags & SMB_IDMAP_ID2SID) {
13149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		/*
13159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		 * SIDs are allocated only when mapping
13169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		 * UID/GID to SIDs
13179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		 */
13189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		for (i = 0; i < sib->sib_nmap; i++)
13199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			smb_sid_free(sib->sib_maps[i].sim_sid);
13209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	} else if (sib->sib_flags & SMB_IDMAP_SID2ID) {
13219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		/*
13229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		 * SID prefixes are allocated only when mapping
13239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		 * SIDs to UID/GID
13249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		 */
13259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		for (i = 0; i < sib->sib_nmap; i++) {
13269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			domsid = sib->sib_maps[i].sim_domsid;
13279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			if (domsid)
13289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 				smb_mem_free(domsid);
13299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
13309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
13319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
13329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (sib->sib_size && sib->sib_maps)
13339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		kmem_free(sib->sib_maps, sib->sib_size);
13349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
13359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
13369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
13379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_idmap_batch_getid
13389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
13399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Queue a request to map the given SID to a UID or GID.
13409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
13419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * sim->sim_id should point to variable that's supposed to
13429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * hold the returned UID/GID. This needs to be setup by caller
13439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * of this function.
13449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
13459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * If requested ID type is known, it's passed as 'idtype',
13469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * if it's unknown it'll be returned in sim->sim_idtype.
13479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
13489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States idmap_stat
13499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_idmap_batch_getid(idmap_get_handle_t *idmaph, smb_idmap_t *sim,
13509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_sid_t *sid, int idtype)
13519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
13529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	char strsid[SMB_SID_STRSZ];
13539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	idmap_stat idm_stat;
13549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
13559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(idmaph);
13569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(sim);
13579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(sid);
13589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
13599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_sid_tostr(sid, strsid);
13609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_sid_splitstr(strsid, &sim->sim_rid) != 0)
13619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (IDMAP_ERR_SID);
13629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	sim->sim_domsid = smb_mem_strdup(strsid);
13639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
13649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	switch (idtype) {
13659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_IDMAP_USER:
13669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		idm_stat = kidmap_batch_getuidbysid(idmaph, sim->sim_domsid,
13679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    sim->sim_rid, sim->sim_id, &sim->sim_stat);
13689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		break;
13699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
13709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_IDMAP_GROUP:
13719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		idm_stat = kidmap_batch_getgidbysid(idmaph, sim->sim_domsid,
13729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    sim->sim_rid, sim->sim_id, &sim->sim_stat);
13739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		break;
13749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
13759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_IDMAP_UNKNOWN:
13769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		idm_stat = kidmap_batch_getpidbysid(idmaph, sim->sim_domsid,
13779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    sim->sim_rid, sim->sim_id, &sim->sim_idtype,
13789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    &sim->sim_stat);
13799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		break;
13809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
13819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	default:
13829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		ASSERT(0);
13839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (IDMAP_ERR_ARG);
13849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
13859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
13869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (idm_stat);
13879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
13889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
13899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
13909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_idmap_batch_getsid
13919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
13929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Queue a request to map the given UID/GID to a SID.
13939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
13949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * sim->sim_domsid and sim->sim_rid will contain the mapping
13959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * result upon successful process of the batched request.
13969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
13979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States idmap_stat
13989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_idmap_batch_getsid(idmap_get_handle_t *idmaph, smb_idmap_t *sim,
13999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     uid_t id, int idtype)
14009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
14019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	idmap_stat idm_stat;
14029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
14039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	switch (idtype) {
14049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_IDMAP_USER:
14059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		idm_stat = kidmap_batch_getsidbyuid(idmaph, id,
14069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    (const char **)&sim->sim_domsid, &sim->sim_rid,
14079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    &sim->sim_stat);
14089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		break;
14099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
14109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_IDMAP_GROUP:
14119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		idm_stat = kidmap_batch_getsidbygid(idmaph, id,
14129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    (const char **)&sim->sim_domsid, &sim->sim_rid,
14139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    &sim->sim_stat);
14149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		break;
14159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
14169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_IDMAP_OWNERAT:
14179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		/* Current Owner S-1-5-32-766 */
14189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		sim->sim_domsid = NT_BUILTIN_DOMAIN_SIDSTR;
14199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		sim->sim_rid = SECURITY_CURRENT_OWNER_RID;
14209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		sim->sim_stat = IDMAP_SUCCESS;
14219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		idm_stat = IDMAP_SUCCESS;
14229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		break;
14239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
14249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_IDMAP_GROUPAT:
14259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		/* Current Group S-1-5-32-767 */
14269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		sim->sim_domsid = NT_BUILTIN_DOMAIN_SIDSTR;
14279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		sim->sim_rid = SECURITY_CURRENT_GROUP_RID;
14289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		sim->sim_stat = IDMAP_SUCCESS;
14299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		idm_stat = IDMAP_SUCCESS;
14309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		break;
14319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
14329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_IDMAP_EVERYONE:
14339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		/* Everyone S-1-1-0 */
14349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		sim->sim_domsid = NT_WORLD_AUTH_SIDSTR;
14359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		sim->sim_rid = 0;
14369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		sim->sim_stat = IDMAP_SUCCESS;
14379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		idm_stat = IDMAP_SUCCESS;
14389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		break;
14399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
14409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	default:
14419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		ASSERT(0);
14429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (IDMAP_ERR_ARG);
14439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
14449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
14459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (idm_stat);
14469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
14479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
14489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
14499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_idmap_batch_binsid
14509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
14519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Convert sidrids to binary sids
14529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
14539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Returns 0 if successful and non-zero upon failure.
14549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
14559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
14569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_idmap_batch_binsid(smb_idmap_batch_t *sib)
14579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
14589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_sid_t *sid;
14599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_idmap_t *sim;
14609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int i;
14619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
14629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (sib->sib_flags & SMB_IDMAP_SID2ID)
14639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		/* This operation is not required */
14649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (0);
14659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
14669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	sim = sib->sib_maps;
14679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	for (i = 0; i < sib->sib_nmap; sim++, i++) {
14689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		ASSERT(sim->sim_domsid);
14699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (sim->sim_domsid == NULL)
14709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			return (1);
14719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
14729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if ((sid = smb_sid_fromstr(sim->sim_domsid)) == NULL)
14739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			return (1);
14749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
14759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		sim->sim_sid = smb_sid_splice(sid, sim->sim_rid);
14769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smb_sid_free(sid);
14779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
14789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
14799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (0);
14809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
14819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
14829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
14839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_idmap_batch_getmappings
14849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
14859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * trigger ID mapping service to get the mappings for queued
14869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * requests.
14879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
14889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Checks the result of all the queued requests.
14899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * If this is a Solaris -> Windows mapping it generates
14909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * binary SIDs from returned (domsid, rid) pairs.
14919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
14929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States idmap_stat
14939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_idmap_batch_getmappings(smb_idmap_batch_t *sib)
14949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
14959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	idmap_stat idm_stat = IDMAP_SUCCESS;
14969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int i;
14979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
14989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	idm_stat = kidmap_get_mappings(sib->sib_idmaph);
14999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (idm_stat != IDMAP_SUCCESS)
15009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (idm_stat);
15019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
15029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	/*
15039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	 * Check the status for all the queued requests
15049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	 */
15059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	for (i = 0; i < sib->sib_nmap; i++) {
15069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (sib->sib_maps[i].sim_stat != IDMAP_SUCCESS)
15079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			return (sib->sib_maps[i].sim_stat);
15089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
15099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
15109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_idmap_batch_binsid(sib) != 0)
15119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		idm_stat = IDMAP_ERR_OTHER;
15129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
15139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (idm_stat);
15149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
15159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
15169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint64_t
15179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_time_unix_to_nt(timestruc_t *unix_time)
15189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
15199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint64_t nt_time;
15209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
15219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((unix_time->tv_sec == 0) && (unix_time->tv_nsec == 0))
15229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (0);
15239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
15249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	nt_time = unix_time->tv_sec;
15259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	nt_time *= 10000000;  /* seconds to 100ns */
15269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	nt_time += unix_time->tv_nsec / 100;
15279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (nt_time + NT_TIME_BIAS);
15289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
15299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
15309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
15319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_time_nt_to_unix(uint64_t nt_time, timestruc_t *unix_time)
15329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
15339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t seconds;
15349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
15359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(unix_time);
15369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
15379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((nt_time == 0) || (nt_time == -1)) {
15389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		unix_time->tv_sec = 0;
15399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		unix_time->tv_nsec = 0;
15409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return;
15419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
15429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
15439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	nt_time -= NT_TIME_BIAS;
15449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	seconds = nt_time / 10000000;
15459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	unix_time->tv_sec = seconds;
15469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	unix_time->tv_nsec = (nt_time  % 10000000) * 100;
15479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
15489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
15499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
15509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_time_gmt_to_local, smb_time_local_to_gmt
15519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
15529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Apply the gmt offset to convert between local time and gmt
15539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
15549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int32_t
15559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_time_gmt_to_local(smb_request_t *sr, int32_t gmt)
15569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
15579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((gmt == 0) || (gmt == -1))
15589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (0);
15599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
15609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (gmt - sr->sr_gmtoff);
15619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
15629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
15639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int32_t
15649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_time_local_to_gmt(smb_request_t *sr, int32_t local)
15659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
15669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((local == 0) || (local == -1))
15679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (0);
15689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
15699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (local + sr->sr_gmtoff);
15709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
15719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
15729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
15739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
15749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_time_dos_to_unix
15759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
15769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Convert SMB_DATE & SMB_TIME values to a unix timestamp.
15779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
15789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * A date/time field of 0 means that that server file system
15799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * assigned value need not be changed. The behaviour when the
15809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * date/time field is set to -1 is not documented but is
15819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * generally treated like 0.
15829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * If date or time is 0 or -1 the unix time is returned as 0
15839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * so that the caller can identify and handle this special case.
15849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
15859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int32_t
15869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_time_dos_to_unix(int16_t date, int16_t time)
15879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
15889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	struct tm	atm;
15899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
15909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (((date == 0) || (time == 0)) ||
15919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    ((date == -1) || (time == -1))) {
15929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (0);
15939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
15949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
15959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	atm.tm_year = ((date >>  9) & 0x3F) + 80;
15969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	atm.tm_mon  = ((date >>  5) & 0x0F) - 1;
15979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	atm.tm_mday = ((date >>  0) & 0x1F);
15989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	atm.tm_hour = ((time >> 11) & 0x1F);
15999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	atm.tm_min  = ((time >>  5) & 0x3F);
16009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	atm.tm_sec  = ((time >>  0) & 0x1F) << 1;
16019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
16029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (smb_timegm(&atm));
16039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
16049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
16059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
16069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_time_unix_to_dos(int32_t ux_time, int16_t *date_p, int16_t *time_p)
16079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
16089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	struct tm	atm;
16099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int		i;
16109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	time_t		tmp_time;
16119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
16129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (ux_time == 0) {
16139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		*date_p = 0;
16149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		*time_p = 0;
16159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return;
16169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
16179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
16189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	tmp_time = (time_t)ux_time;
16199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) smb_gmtime_r(&tmp_time, &atm);
16209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
16219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (date_p) {
16229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		i = 0;
16239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		i += atm.tm_year - 80;
16249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		i <<= 4;
16259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		i += atm.tm_mon + 1;
16269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		i <<= 5;
16279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		i += atm.tm_mday;
16289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
16299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		*date_p = (short)i;
16309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
16319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (time_p) {
16329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		i = 0;
16339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		i += atm.tm_hour;
16349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		i <<= 6;
16359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		i += atm.tm_min;
16369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		i <<= 5;
16379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		i += atm.tm_sec >> 1;
16389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
16399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		*time_p = (short)i;
16409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
16419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
16429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
16439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
16449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
16459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_gmtime_r
16469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
16479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Thread-safe version of smb_gmtime. Returns a null pointer if either
16489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * input parameter is a null pointer. Otherwise returns a pointer
16499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * to result.
16509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
16519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Day of the week calculation: the Epoch was a thursday.
16529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
16539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * There are no timezone corrections so tm_isdst and tm_gmtoff are
16549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * always zero, and the zone is always WET.
16559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
16569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States struct tm *
16579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_gmtime_r(time_t *clock, struct tm *result)
16589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
16599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	time_t tsec;
16609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int year;
16619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int month;
16629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int sec_per_month;
16639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
16649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (clock == 0 || result == 0)
16659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (0);
16669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
16679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(result, sizeof (struct tm));
16689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	tsec = *clock;
16699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	tsec -= tzh_leapcnt;
16709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
16719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	result->tm_wday = tsec / SECSPERDAY;
16729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	result->tm_wday = (result->tm_wday + TM_THURSDAY) % DAYSPERWEEK;
16739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
16749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	year = EPOCH_YEAR;
16759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	while (tsec >= (isleap(year) ? (SECSPERDAY * DAYSPERLYEAR) :
16769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    (SECSPERDAY * DAYSPERNYEAR))) {
16779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (isleap(year))
16789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			tsec -= SECSPERDAY * DAYSPERLYEAR;
16799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		else
16809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			tsec -= SECSPERDAY * DAYSPERNYEAR;
16819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
16829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		++year;
16839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
16849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
16859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	result->tm_year = year - TM_YEAR_BASE;
16869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	result->tm_yday = tsec / SECSPERDAY;
16879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
16889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	for (month = TM_JANUARY; month <= TM_DECEMBER; ++month) {
16899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		sec_per_month = days_in_month[month] * SECSPERDAY;
16909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
16919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (month == TM_FEBRUARY && isleap(year))
16929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			sec_per_month += SECSPERDAY;
16939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
16949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (tsec < sec_per_month)
16959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			break;
16969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
16979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		tsec -= sec_per_month;
16989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
16999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
17009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	result->tm_mon = month;
17019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	result->tm_mday = (tsec / SECSPERDAY) + 1;
17029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	tsec %= SECSPERDAY;
17039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	result->tm_sec = tsec % 60;
17049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	tsec /= 60;
17059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	result->tm_min = tsec % 60;
17069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	tsec /= 60;
17079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	result->tm_hour = (int)tsec;
17089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
17099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (result);
17109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
17119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
17129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
17139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
17149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_timegm
17159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
17169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Converts the broken-down time in tm to a time value, i.e. the number
17179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * of seconds since the Epoch (00:00:00 UTC, January 1, 1970). This is
17189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * not a POSIX or ANSI function. Per the man page, the input values of
17199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * tm_wday and tm_yday are ignored and, as the input data is assumed to
17209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * represent GMT, we force tm_isdst and tm_gmtoff to 0.
17219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
17229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Before returning the clock time, we use smb_gmtime_r to set up tm_wday
17239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * and tm_yday, and bring the other fields within normal range. I don't
17249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * think this is really how it should be done but it's convenient for
17259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * now.
17269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
17279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States time_t
17289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_timegm(struct tm *tm)
17299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
17309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	time_t tsec;
17319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int dd;
17329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int mm;
17339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int yy;
17349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int year;
17359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
17369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (tm == 0)
17379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (-1);
17389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
17399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	year = tm->tm_year + TM_YEAR_BASE;
17409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	tsec = tzh_leapcnt;
17419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
17429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	for (yy = EPOCH_YEAR; yy < year; ++yy) {
17439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (isleap(yy))
17449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			tsec += SECSPERDAY * DAYSPERLYEAR;
17459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		else
17469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			tsec += SECSPERDAY * DAYSPERNYEAR;
17479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
17489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
17499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	for (mm = TM_JANUARY; mm < tm->tm_mon; ++mm) {
17509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		dd = days_in_month[mm] * SECSPERDAY;
17519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
17529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (mm == TM_FEBRUARY && isleap(year))
17539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			dd += SECSPERDAY;
17549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
17559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		tsec += dd;
17569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
17579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
17589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	tsec += (tm->tm_mday - 1) * SECSPERDAY;
17599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	tsec += tm->tm_sec;
17609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	tsec += tm->tm_min * SECSPERMIN;
17619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	tsec += tm->tm_hour * SECSPERHOUR;
17629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
17639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	tm->tm_isdst = 0;
17649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	(void) smb_gmtime_r(&tsec, tm);
17659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (tsec);
17669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
17679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
17689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
17699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_pad_align
17709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
17719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Returns the number of bytes required to pad an offset to the
17729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * specified alignment.
17739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
17749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t
17759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_pad_align(uint32_t offset, uint32_t align)
17769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
17779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t pad = offset % align;
17789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
17799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (pad != 0)
17809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		pad = align - pad;
17819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
17829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (pad);
17839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
17849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
17859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
17869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_panic
17879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
17889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Logs the file name, function name and line number passed in and panics the
17899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * system.
17909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
17919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
17929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_panic(char *file, const char *func, int line)
17939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
17949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	cmn_err(CE_PANIC, "%s:%s:%d\n", file, func, line);
17959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
1796148c5f43SAlan Wright 
1797148c5f43SAlan Wright /*
1798148c5f43SAlan Wright  * Creates an AVL tree and initializes the given smb_avl_t
1799148c5f43SAlan Wright  * structure using the passed args
1800148c5f43SAlan Wright  */
1801148c5f43SAlan Wright void
1802148c5f43SAlan Wright smb_avl_create(smb_avl_t *avl, size_t size, size_t offset, smb_avl_nops_t *ops)
1803148c5f43SAlan Wright {
1804148c5f43SAlan Wright 	ASSERT(avl);
1805148c5f43SAlan Wright 	ASSERT(ops);
1806148c5f43SAlan Wright 
1807148c5f43SAlan Wright 	rw_init(&avl->avl_lock, NULL, RW_DEFAULT, NULL);
1808148c5f43SAlan Wright 	mutex_init(&avl->avl_mutex, NULL, MUTEX_DEFAULT, NULL);
1809148c5f43SAlan Wright 
1810148c5f43SAlan Wright 	avl->avl_nops = ops;
1811148c5f43SAlan Wright 	avl->avl_state = SMB_AVL_STATE_READY;
1812148c5f43SAlan Wright 	avl->avl_refcnt = 0;
1813148c5f43SAlan Wright 	(void) random_get_pseudo_bytes((uint8_t *)&avl->avl_sequence,
1814148c5f43SAlan Wright 	    sizeof (uint32_t));
1815148c5f43SAlan Wright 
1816148c5f43SAlan Wright 	avl_create(&avl->avl_tree, ops->avln_cmp, size, offset);
1817148c5f43SAlan Wright }
1818148c5f43SAlan Wright 
1819148c5f43SAlan Wright /*
1820148c5f43SAlan Wright  * Destroys the specified AVL tree.
1821148c5f43SAlan Wright  * It waits for all the in-flight operations to finish
1822148c5f43SAlan Wright  * before destroying the AVL.
1823148c5f43SAlan Wright  */
1824148c5f43SAlan Wright void
1825148c5f43SAlan Wright smb_avl_destroy(smb_avl_t *avl)
1826148c5f43SAlan Wright {
1827148c5f43SAlan Wright 	void *cookie = NULL;
1828148c5f43SAlan Wright 	void *node;
1829148c5f43SAlan Wright 
1830148c5f43SAlan Wright 	ASSERT(avl);
1831148c5f43SAlan Wright 
1832148c5f43SAlan Wright 	mutex_enter(&avl->avl_mutex);
1833148c5f43SAlan Wright 	if (avl->avl_state != SMB_AVL_STATE_READY) {
1834148c5f43SAlan Wright 		mutex_exit(&avl->avl_mutex);
1835148c5f43SAlan Wright 		return;
1836148c5f43SAlan Wright 	}
1837148c5f43SAlan Wright 
1838148c5f43SAlan Wright 	avl->avl_state = SMB_AVL_STATE_DESTROYING;
1839148c5f43SAlan Wright 
1840148c5f43SAlan Wright 	while (avl->avl_refcnt > 0)
1841148c5f43SAlan Wright 		(void) cv_wait(&avl->avl_cv, &avl->avl_mutex);
1842148c5f43SAlan Wright 	mutex_exit(&avl->avl_mutex);
1843148c5f43SAlan Wright 
1844148c5f43SAlan Wright 	rw_enter(&avl->avl_lock, RW_WRITER);
1845148c5f43SAlan Wright 	while ((node = avl_destroy_nodes(&avl->avl_tree, &cookie)) != NULL)
1846148c5f43SAlan Wright 		avl->avl_nops->avln_destroy(node);
1847148c5f43SAlan Wright 
1848148c5f43SAlan Wright 	avl_destroy(&avl->avl_tree);
1849148c5f43SAlan Wright 	rw_exit(&avl->avl_lock);
1850148c5f43SAlan Wright 
1851148c5f43SAlan Wright 	rw_destroy(&avl->avl_lock);
1852148c5f43SAlan Wright 
1853148c5f43SAlan Wright 	mutex_destroy(&avl->avl_mutex);
1854148c5f43SAlan Wright 	bzero(avl, sizeof (smb_avl_t));
1855148c5f43SAlan Wright }
1856148c5f43SAlan Wright 
1857148c5f43SAlan Wright /*
1858148c5f43SAlan Wright  * Adds the given item to the AVL if it's
1859148c5f43SAlan Wright  * not already there.
1860148c5f43SAlan Wright  *
1861148c5f43SAlan Wright  * Returns:
1862148c5f43SAlan Wright  *
1863148c5f43SAlan Wright  * 	ENOTACTIVE	AVL is not in READY state
1864148c5f43SAlan Wright  * 	EEXIST		The item is already in AVL
1865148c5f43SAlan Wright  */
1866148c5f43SAlan Wright int
1867148c5f43SAlan Wright smb_avl_add(smb_avl_t *avl, void *item)
1868148c5f43SAlan Wright {
1869148c5f43SAlan Wright 	avl_index_t where;
1870148c5f43SAlan Wright 
1871148c5f43SAlan Wright 	ASSERT(avl);
1872148c5f43SAlan Wright 	ASSERT(item);
1873148c5f43SAlan Wright 
1874148c5f43SAlan Wright 	if (!smb_avl_hold(avl))
1875148c5f43SAlan Wright 		return (ENOTACTIVE);
1876148c5f43SAlan Wright 
1877148c5f43SAlan Wright 	rw_enter(&avl->avl_lock, RW_WRITER);
1878148c5f43SAlan Wright 	if (avl_find(&avl->avl_tree, item, &where) != NULL) {
1879148c5f43SAlan Wright 		rw_exit(&avl->avl_lock);
1880148c5f43SAlan Wright 		smb_avl_rele(avl);
1881148c5f43SAlan Wright 		return (EEXIST);
1882148c5f43SAlan Wright 	}
1883148c5f43SAlan Wright 
1884148c5f43SAlan Wright 	avl_insert(&avl->avl_tree, item, where);
1885148c5f43SAlan Wright 	avl->avl_sequence++;
1886148c5f43SAlan Wright 	rw_exit(&avl->avl_lock);
1887148c5f43SAlan Wright 
1888148c5f43SAlan Wright 	smb_avl_rele(avl);
1889148c5f43SAlan Wright 	return (0);
1890148c5f43SAlan Wright }
1891148c5f43SAlan Wright 
1892148c5f43SAlan Wright /*
1893148c5f43SAlan Wright  * Removes the given item from the AVL.
1894148c5f43SAlan Wright  * If no reference is left on the item
1895148c5f43SAlan Wright  * it will also be destroyed by calling the
1896148c5f43SAlan Wright  * registered destroy operation.
1897148c5f43SAlan Wright  */
1898148c5f43SAlan Wright void
1899148c5f43SAlan Wright smb_avl_remove(smb_avl_t *avl, void *item)
1900148c5f43SAlan Wright {
1901148c5f43SAlan Wright 	avl_index_t where;
1902148c5f43SAlan Wright 	void *rm_item;
1903148c5f43SAlan Wright 
1904148c5f43SAlan Wright 	ASSERT(avl);
1905148c5f43SAlan Wright 	ASSERT(item);
1906148c5f43SAlan Wright 
1907148c5f43SAlan Wright 	if (!smb_avl_hold(avl))
1908148c5f43SAlan Wright 		return;
1909148c5f43SAlan Wright 
1910148c5f43SAlan Wright 	rw_enter(&avl->avl_lock, RW_WRITER);
1911148c5f43SAlan Wright 	if ((rm_item = avl_find(&avl->avl_tree, item, &where)) == NULL) {
1912148c5f43SAlan Wright 		rw_exit(&avl->avl_lock);
1913148c5f43SAlan Wright 		smb_avl_rele(avl);
1914148c5f43SAlan Wright 		return;
1915148c5f43SAlan Wright 	}
1916148c5f43SAlan Wright 
1917148c5f43SAlan Wright 	avl_remove(&avl->avl_tree, rm_item);
1918148c5f43SAlan Wright 	if (avl->avl_nops->avln_rele(rm_item))
1919148c5f43SAlan Wright 		avl->avl_nops->avln_destroy(rm_item);
1920148c5f43SAlan Wright 	avl->avl_sequence++;
1921148c5f43SAlan Wright 	rw_exit(&avl->avl_lock);
1922148c5f43SAlan Wright 
1923148c5f43SAlan Wright 	smb_avl_rele(avl);
1924148c5f43SAlan Wright }
1925148c5f43SAlan Wright 
1926148c5f43SAlan Wright /*
1927148c5f43SAlan Wright  * Looks up the AVL for the given item.
1928148c5f43SAlan Wright  * If the item is found a hold on the object
1929148c5f43SAlan Wright  * is taken before the pointer to it is
1930148c5f43SAlan Wright  * returned to the caller. The caller MUST
1931148c5f43SAlan Wright  * always call smb_avl_release() after it's done
1932148c5f43SAlan Wright  * using the returned object to release the hold
1933148c5f43SAlan Wright  * taken on the object.
1934148c5f43SAlan Wright  */
1935148c5f43SAlan Wright void *
1936148c5f43SAlan Wright smb_avl_lookup(smb_avl_t *avl, void *item)
1937148c5f43SAlan Wright {
1938148c5f43SAlan Wright 	void *node = NULL;
1939148c5f43SAlan Wright 
1940148c5f43SAlan Wright 	ASSERT(avl);
1941148c5f43SAlan Wright 	ASSERT(item);
1942148c5f43SAlan Wright 
1943148c5f43SAlan Wright 	if (!smb_avl_hold(avl))
1944148c5f43SAlan Wright 		return (NULL);
1945148c5f43SAlan Wright 
1946148c5f43SAlan Wright 	rw_enter(&avl->avl_lock, RW_READER);
1947148c5f43SAlan Wright 	node = avl_find(&avl->avl_tree, item, NULL);
1948148c5f43SAlan Wright 	if (node != NULL)
1949148c5f43SAlan Wright 		avl->avl_nops->avln_hold(node);
1950148c5f43SAlan Wright 	rw_exit(&avl->avl_lock);
1951148c5f43SAlan Wright 
1952148c5f43SAlan Wright 	if (node == NULL)
1953148c5f43SAlan Wright 		smb_avl_rele(avl);
1954148c5f43SAlan Wright 
1955148c5f43SAlan Wright 	return (node);
1956148c5f43SAlan Wright }
1957148c5f43SAlan Wright 
1958148c5f43SAlan Wright /*
1959148c5f43SAlan Wright  * The hold on the given object is released.
1960148c5f43SAlan Wright  * This function MUST always be called after
1961148c5f43SAlan Wright  * smb_avl_lookup() and smb_avl_iterate() for
1962148c5f43SAlan Wright  * the returned object.
1963148c5f43SAlan Wright  *
1964148c5f43SAlan Wright  * If AVL is in DESTROYING state, the destroying
1965148c5f43SAlan Wright  * thread will be notified.
1966148c5f43SAlan Wright  */
1967148c5f43SAlan Wright void
1968148c5f43SAlan Wright smb_avl_release(smb_avl_t *avl, void *item)
1969148c5f43SAlan Wright {
1970148c5f43SAlan Wright 	ASSERT(avl);
1971148c5f43SAlan Wright 	ASSERT(item);
1972148c5f43SAlan Wright 
1973148c5f43SAlan Wright 	if (avl->avl_nops->avln_rele(item))
1974148c5f43SAlan Wright 		avl->avl_nops->avln_destroy(item);
1975148c5f43SAlan Wright 
1976148c5f43SAlan Wright 	smb_avl_rele(avl);
1977148c5f43SAlan Wright }
1978148c5f43SAlan Wright 
1979148c5f43SAlan Wright /*
1980148c5f43SAlan Wright  * Initializes the given cursor for the AVL.
1981148c5f43SAlan Wright  * The cursor will be used to iterate through the AVL
1982148c5f43SAlan Wright  */
1983148c5f43SAlan Wright void
1984148c5f43SAlan Wright smb_avl_iterinit(smb_avl_t *avl, smb_avl_cursor_t *cursor)
1985148c5f43SAlan Wright {
1986148c5f43SAlan Wright 	ASSERT(avl);
1987148c5f43SAlan Wright 	ASSERT(cursor);
1988148c5f43SAlan Wright 
1989148c5f43SAlan Wright 	cursor->avlc_next = NULL;
1990148c5f43SAlan Wright 	cursor->avlc_sequence = avl->avl_sequence;
1991148c5f43SAlan Wright }
1992148c5f43SAlan Wright 
1993148c5f43SAlan Wright /*
1994148c5f43SAlan Wright  * Iterates through the AVL using the given cursor.
1995148c5f43SAlan Wright  * It always starts at the beginning and then returns
1996148c5f43SAlan Wright  * a pointer to the next object on each subsequent call.
1997148c5f43SAlan Wright  *
1998148c5f43SAlan Wright  * If a new object is added to or removed from the AVL
1999148c5f43SAlan Wright  * between two calls to this function, the iteration
2000148c5f43SAlan Wright  * will terminate prematurely.
2001148c5f43SAlan Wright  *
2002148c5f43SAlan Wright  * The caller MUST always call smb_avl_release() after it's
2003148c5f43SAlan Wright  * done using the returned object to release the hold taken
2004148c5f43SAlan Wright  * on the object.
2005148c5f43SAlan Wright  */
2006148c5f43SAlan Wright void *
2007148c5f43SAlan Wright smb_avl_iterate(smb_avl_t *avl, smb_avl_cursor_t *cursor)
2008148c5f43SAlan Wright {
2009148c5f43SAlan Wright 	void *node;
2010148c5f43SAlan Wright 
2011148c5f43SAlan Wright 	ASSERT(avl);
2012148c5f43SAlan Wright 	ASSERT(cursor);
2013148c5f43SAlan Wright 
2014148c5f43SAlan Wright 	if (!smb_avl_hold(avl))
2015148c5f43SAlan Wright 		return (NULL);
2016148c5f43SAlan Wright 
2017148c5f43SAlan Wright 	rw_enter(&avl->avl_lock, RW_READER);
2018148c5f43SAlan Wright 	if (cursor->avlc_sequence != avl->avl_sequence) {
2019148c5f43SAlan Wright 		rw_exit(&avl->avl_lock);
2020148c5f43SAlan Wright 		smb_avl_rele(avl);
2021148c5f43SAlan Wright 		return (NULL);
2022148c5f43SAlan Wright 	}
2023148c5f43SAlan Wright 
2024148c5f43SAlan Wright 	if (cursor->avlc_next == NULL)
2025148c5f43SAlan Wright 		node = avl_first(&avl->avl_tree);
2026148c5f43SAlan Wright 	else
2027148c5f43SAlan Wright 		node = AVL_NEXT(&avl->avl_tree, cursor->avlc_next);
2028148c5f43SAlan Wright 
2029148c5f43SAlan Wright 	if (node != NULL)
2030148c5f43SAlan Wright 		avl->avl_nops->avln_hold(node);
2031148c5f43SAlan Wright 
2032148c5f43SAlan Wright 	cursor->avlc_next = node;
2033148c5f43SAlan Wright 	rw_exit(&avl->avl_lock);
2034148c5f43SAlan Wright 
2035148c5f43SAlan Wright 	if (node == NULL)
2036148c5f43SAlan Wright 		smb_avl_rele(avl);
2037148c5f43SAlan Wright 
2038148c5f43SAlan Wright 	return (node);
2039148c5f43SAlan Wright }
2040148c5f43SAlan Wright 
2041148c5f43SAlan Wright /*
2042148c5f43SAlan Wright  * Increments the AVL reference count in order to
2043148c5f43SAlan Wright  * prevent the avl from being destroyed while it's
2044148c5f43SAlan Wright  * being accessed.
2045148c5f43SAlan Wright  */
2046148c5f43SAlan Wright static boolean_t
2047148c5f43SAlan Wright smb_avl_hold(smb_avl_t *avl)
2048148c5f43SAlan Wright {
2049148c5f43SAlan Wright 	mutex_enter(&avl->avl_mutex);
2050148c5f43SAlan Wright 	if (avl->avl_state != SMB_AVL_STATE_READY) {
2051148c5f43SAlan Wright 		mutex_exit(&avl->avl_mutex);
2052148c5f43SAlan Wright 		return (B_FALSE);
2053148c5f43SAlan Wright 	}
2054148c5f43SAlan Wright 	avl->avl_refcnt++;
2055148c5f43SAlan Wright 	mutex_exit(&avl->avl_mutex);
2056148c5f43SAlan Wright 
2057148c5f43SAlan Wright 	return (B_TRUE);
2058148c5f43SAlan Wright }
2059148c5f43SAlan Wright 
2060148c5f43SAlan Wright /*
2061148c5f43SAlan Wright  * Decrements the AVL reference count to release the
2062148c5f43SAlan Wright  * hold. If another thread is trying to destroy the
2063148c5f43SAlan Wright  * AVL and is waiting for the reference count to become
2064148c5f43SAlan Wright  * 0, it is signaled to wake up.
2065148c5f43SAlan Wright  */
2066148c5f43SAlan Wright static void
2067148c5f43SAlan Wright smb_avl_rele(smb_avl_t *avl)
2068148c5f43SAlan Wright {
2069148c5f43SAlan Wright 	mutex_enter(&avl->avl_mutex);
2070148c5f43SAlan Wright 	ASSERT(avl->avl_refcnt > 0);
2071148c5f43SAlan Wright 	avl->avl_refcnt--;
2072148c5f43SAlan Wright 	if (avl->avl_state == SMB_AVL_STATE_DESTROYING)
2073148c5f43SAlan Wright 		cv_broadcast(&avl->avl_cv);
2074148c5f43SAlan Wright 	mutex_exit(&avl->avl_mutex);
2075148c5f43SAlan Wright }
2076148c5f43SAlan Wright 
2077148c5f43SAlan Wright /*
2078148c5f43SAlan Wright  * smb_latency_init
2079148c5f43SAlan Wright  */
2080148c5f43SAlan Wright void
2081148c5f43SAlan Wright smb_latency_init(smb_latency_t *lat)
2082148c5f43SAlan Wright {
2083148c5f43SAlan Wright 	bzero(lat, sizeof (*lat));
2084148c5f43SAlan Wright 	mutex_init(&lat->ly_mutex, NULL, MUTEX_SPIN, (void *)ipltospl(SPL7));
2085148c5f43SAlan Wright }
2086148c5f43SAlan Wright 
2087148c5f43SAlan Wright /*
2088148c5f43SAlan Wright  * smb_latency_destroy
2089148c5f43SAlan Wright  */
2090148c5f43SAlan Wright void
2091148c5f43SAlan Wright smb_latency_destroy(smb_latency_t *lat)
2092148c5f43SAlan Wright {
2093148c5f43SAlan Wright 	mutex_destroy(&lat->ly_mutex);
2094148c5f43SAlan Wright }
2095148c5f43SAlan Wright 
2096148c5f43SAlan Wright /*
2097148c5f43SAlan Wright  * smb_latency_add_sample
2098148c5f43SAlan Wright  *
2099148c5f43SAlan Wright  * Uses the new sample to calculate the new mean and standard deviation. The
2100148c5f43SAlan Wright  * sample must be a scaled value.
2101148c5f43SAlan Wright  */
2102148c5f43SAlan Wright void
2103148c5f43SAlan Wright smb_latency_add_sample(smb_latency_t *lat, hrtime_t sample)
2104148c5f43SAlan Wright {
2105148c5f43SAlan Wright 	hrtime_t	a_mean;
2106148c5f43SAlan Wright 	hrtime_t	d_mean;
2107148c5f43SAlan Wright 
2108148c5f43SAlan Wright 	mutex_enter(&lat->ly_mutex);
2109148c5f43SAlan Wright 	lat->ly_a_nreq++;
2110148c5f43SAlan Wright 	lat->ly_a_sum += sample;
2111148c5f43SAlan Wright 	if (lat->ly_a_nreq != 0) {
2112148c5f43SAlan Wright 		a_mean = lat->ly_a_sum / lat->ly_a_nreq;
2113148c5f43SAlan Wright 		lat->ly_a_stddev =
2114148c5f43SAlan Wright 		    (sample - a_mean) * (sample - lat->ly_a_mean);
2115148c5f43SAlan Wright 		lat->ly_a_mean = a_mean;
2116148c5f43SAlan Wright 	}
2117148c5f43SAlan Wright 	lat->ly_d_nreq++;
2118148c5f43SAlan Wright 	lat->ly_d_sum += sample;
2119148c5f43SAlan Wright 	if (lat->ly_d_nreq != 0) {
2120148c5f43SAlan Wright 		d_mean = lat->ly_d_sum / lat->ly_d_nreq;
2121148c5f43SAlan Wright 		lat->ly_d_stddev =
2122148c5f43SAlan Wright 		    (sample - d_mean) * (sample - lat->ly_d_mean);
2123148c5f43SAlan Wright 		lat->ly_d_mean = d_mean;
2124148c5f43SAlan Wright 	}
2125148c5f43SAlan Wright 	mutex_exit(&lat->ly_mutex);
2126148c5f43SAlan Wright }
2127148c5f43SAlan Wright 
2128148c5f43SAlan Wright /*
2129148c5f43SAlan Wright  * smb_srqueue_init
2130148c5f43SAlan Wright  */
2131148c5f43SAlan Wright void
2132148c5f43SAlan Wright smb_srqueue_init(smb_srqueue_t *srq)
2133148c5f43SAlan Wright {
2134148c5f43SAlan Wright 	bzero(srq, sizeof (*srq));
2135148c5f43SAlan Wright 	mutex_init(&srq->srq_mutex, NULL, MUTEX_SPIN, (void *)ipltospl(SPL7));
2136148c5f43SAlan Wright 	srq->srq_wlastupdate = srq->srq_rlastupdate = gethrtime_unscaled();
2137148c5f43SAlan Wright }
2138148c5f43SAlan Wright 
2139148c5f43SAlan Wright /*
2140148c5f43SAlan Wright  * smb_srqueue_destroy
2141148c5f43SAlan Wright  */
2142148c5f43SAlan Wright void
2143148c5f43SAlan Wright smb_srqueue_destroy(smb_srqueue_t *srq)
2144148c5f43SAlan Wright {
2145148c5f43SAlan Wright 	mutex_destroy(&srq->srq_mutex);
2146148c5f43SAlan Wright }
2147148c5f43SAlan Wright 
2148148c5f43SAlan Wright /*
2149148c5f43SAlan Wright  * smb_srqueue_waitq_enter
2150148c5f43SAlan Wright  */
2151148c5f43SAlan Wright void
2152148c5f43SAlan Wright smb_srqueue_waitq_enter(smb_srqueue_t *srq)
2153148c5f43SAlan Wright {
2154148c5f43SAlan Wright 	hrtime_t	new;
2155148c5f43SAlan Wright 	hrtime_t	delta;
2156148c5f43SAlan Wright 	uint32_t	wcnt;
2157148c5f43SAlan Wright 
2158148c5f43SAlan Wright 	mutex_enter(&srq->srq_mutex);
2159148c5f43SAlan Wright 	new = gethrtime_unscaled();
2160148c5f43SAlan Wright 	delta = new - srq->srq_wlastupdate;
2161148c5f43SAlan Wright 	srq->srq_wlastupdate = new;
2162148c5f43SAlan Wright 	wcnt = srq->srq_wcnt++;
2163148c5f43SAlan Wright 	if (wcnt != 0) {
2164148c5f43SAlan Wright 		srq->srq_wlentime += delta * wcnt;
2165148c5f43SAlan Wright 		srq->srq_wtime += delta;
2166148c5f43SAlan Wright 	}
2167148c5f43SAlan Wright 	mutex_exit(&srq->srq_mutex);
2168148c5f43SAlan Wright }
2169148c5f43SAlan Wright 
2170148c5f43SAlan Wright /*
2171148c5f43SAlan Wright  * smb_srqueue_runq_exit
2172148c5f43SAlan Wright  */
2173148c5f43SAlan Wright void
2174148c5f43SAlan Wright smb_srqueue_runq_exit(smb_srqueue_t *srq)
2175148c5f43SAlan Wright {
2176148c5f43SAlan Wright 	hrtime_t	new;
2177148c5f43SAlan Wright 	hrtime_t	delta;
2178148c5f43SAlan Wright 	uint32_t	rcnt;
2179148c5f43SAlan Wright 
2180148c5f43SAlan Wright 	mutex_enter(&srq->srq_mutex);
2181148c5f43SAlan Wright 	new = gethrtime_unscaled();
2182148c5f43SAlan Wright 	delta = new - srq->srq_rlastupdate;
2183148c5f43SAlan Wright 	srq->srq_rlastupdate = new;
2184148c5f43SAlan Wright 	rcnt = srq->srq_rcnt--;
2185148c5f43SAlan Wright 	ASSERT(rcnt > 0);
2186148c5f43SAlan Wright 	srq->srq_rlentime += delta * rcnt;
2187148c5f43SAlan Wright 	srq->srq_rtime += delta;
2188148c5f43SAlan Wright 	mutex_exit(&srq->srq_mutex);
2189148c5f43SAlan Wright }
2190148c5f43SAlan Wright 
2191148c5f43SAlan Wright /*
2192148c5f43SAlan Wright  * smb_srqueue_waitq_to_runq
2193148c5f43SAlan Wright  */
2194148c5f43SAlan Wright void
2195148c5f43SAlan Wright smb_srqueue_waitq_to_runq(smb_srqueue_t *srq)
2196148c5f43SAlan Wright {
2197148c5f43SAlan Wright 	hrtime_t	new;
2198148c5f43SAlan Wright 	hrtime_t	delta;
2199148c5f43SAlan Wright 	uint32_t	wcnt;
2200148c5f43SAlan Wright 	uint32_t	rcnt;
2201148c5f43SAlan Wright 
2202148c5f43SAlan Wright 	mutex_enter(&srq->srq_mutex);
2203148c5f43SAlan Wright 	new = gethrtime_unscaled();
2204148c5f43SAlan Wright 	delta = new - srq->srq_wlastupdate;
2205148c5f43SAlan Wright 	srq->srq_wlastupdate = new;
2206148c5f43SAlan Wright 	wcnt = srq->srq_wcnt--;
2207148c5f43SAlan Wright 	ASSERT(wcnt > 0);
2208148c5f43SAlan Wright 	srq->srq_wlentime += delta * wcnt;
2209148c5f43SAlan Wright 	srq->srq_wtime += delta;
2210148c5f43SAlan Wright 	delta = new - srq->srq_rlastupdate;
2211148c5f43SAlan Wright 	srq->srq_rlastupdate = new;
2212148c5f43SAlan Wright 	rcnt = srq->srq_rcnt++;
2213148c5f43SAlan Wright 	if (rcnt != 0) {
2214148c5f43SAlan Wright 		srq->srq_rlentime += delta * rcnt;
2215148c5f43SAlan Wright 		srq->srq_rtime += delta;
2216148c5f43SAlan Wright 	}
2217148c5f43SAlan Wright 	mutex_exit(&srq->srq_mutex);
2218148c5f43SAlan Wright }
2219148c5f43SAlan Wright 
2220148c5f43SAlan Wright /*
2221148c5f43SAlan Wright  * smb_srqueue_update
2222148c5f43SAlan Wright  *
2223148c5f43SAlan Wright  * Takes a snapshot of the smb_sr_stat_t structure passed in.
2224148c5f43SAlan Wright  */
2225148c5f43SAlan Wright void
2226148c5f43SAlan Wright smb_srqueue_update(smb_srqueue_t *srq, smb_kstat_utilization_t *kd)
2227148c5f43SAlan Wright {
2228148c5f43SAlan Wright 	hrtime_t	delta;
2229148c5f43SAlan Wright 	hrtime_t	snaptime;
2230148c5f43SAlan Wright 
2231148c5f43SAlan Wright 	mutex_enter(&srq->srq_mutex);
2232148c5f43SAlan Wright 	snaptime = gethrtime_unscaled();
2233148c5f43SAlan Wright 	delta = snaptime - srq->srq_wlastupdate;
2234148c5f43SAlan Wright 	srq->srq_wlastupdate = snaptime;
2235148c5f43SAlan Wright 	if (srq->srq_wcnt != 0) {
2236148c5f43SAlan Wright 		srq->srq_wlentime += delta * srq->srq_wcnt;
2237148c5f43SAlan Wright 		srq->srq_wtime += delta;
2238148c5f43SAlan Wright 	}
2239148c5f43SAlan Wright 	delta = snaptime - srq->srq_rlastupdate;
2240148c5f43SAlan Wright 	srq->srq_rlastupdate = snaptime;
2241148c5f43SAlan Wright 	if (srq->srq_rcnt != 0) {
2242148c5f43SAlan Wright 		srq->srq_rlentime += delta * srq->srq_rcnt;
2243148c5f43SAlan Wright 		srq->srq_rtime += delta;
2244148c5f43SAlan Wright 	}
2245148c5f43SAlan Wright 	kd->ku_rlentime = srq->srq_rlentime;
2246148c5f43SAlan Wright 	kd->ku_rtime = srq->srq_rtime;
2247148c5f43SAlan Wright 	kd->ku_wlentime = srq->srq_wlentime;
2248148c5f43SAlan Wright 	kd->ku_wtime = srq->srq_wtime;
2249148c5f43SAlan Wright 	mutex_exit(&srq->srq_mutex);
2250148c5f43SAlan Wright 	scalehrtime(&kd->ku_rlentime);
2251148c5f43SAlan Wright 	scalehrtime(&kd->ku_rtime);
2252148c5f43SAlan Wright 	scalehrtime(&kd->ku_wlentime);
2253148c5f43SAlan Wright 	scalehrtime(&kd->ku_wtime);
2254148c5f43SAlan Wright }
2255cb174861Sjoyce mcintosh 
2256cb174861Sjoyce mcintosh void
2257cb174861Sjoyce mcintosh smb_threshold_init(smb_cmd_threshold_t *ct, char *cmd, int threshold,
2258cb174861Sjoyce mcintosh     int timeout)
2259cb174861Sjoyce mcintosh {
2260cb174861Sjoyce mcintosh 	bzero(ct, sizeof (smb_cmd_threshold_t));
2261cb174861Sjoyce mcintosh 	mutex_init(&ct->ct_mutex, NULL, MUTEX_DEFAULT, NULL);
2262cb174861Sjoyce mcintosh 	ct->ct_cmd = cmd;
2263cb174861Sjoyce mcintosh 	ct->ct_threshold = threshold;
2264cb174861Sjoyce mcintosh 	ct->ct_event = smb_event_create(timeout);
2265cb174861Sjoyce mcintosh 	ct->ct_event_id = smb_event_txid(ct->ct_event);
2266cb174861Sjoyce mcintosh 
2267cb174861Sjoyce mcintosh 	if (smb_threshold_debug) {
2268cb174861Sjoyce mcintosh 		cmn_err(CE_NOTE, "smb_threshold_init[%s]: threshold (%d), "
2269cb174861Sjoyce mcintosh 		    "timeout (%d)", cmd, threshold, timeout);
2270cb174861Sjoyce mcintosh 	}
2271cb174861Sjoyce mcintosh }
2272cb174861Sjoyce mcintosh 
2273cb174861Sjoyce mcintosh /*
2274cb174861Sjoyce mcintosh  * This function must be called prior to SMB_SERVER_STATE_STOPPING state
2275cb174861Sjoyce mcintosh  * so that ct_event can be successfully removed from the event list.
2276cb174861Sjoyce mcintosh  * It should not be called when the server mutex is held or when the
2277cb174861Sjoyce mcintosh  * server is removed from the server list.
2278cb174861Sjoyce mcintosh  */
2279cb174861Sjoyce mcintosh void
2280cb174861Sjoyce mcintosh smb_threshold_fini(smb_cmd_threshold_t *ct)
2281cb174861Sjoyce mcintosh {
2282cb174861Sjoyce mcintosh 	smb_event_destroy(ct->ct_event);
2283cb174861Sjoyce mcintosh 	mutex_destroy(&ct->ct_mutex);
2284cb174861Sjoyce mcintosh 	bzero(ct, sizeof (smb_cmd_threshold_t));
2285cb174861Sjoyce mcintosh }
2286cb174861Sjoyce mcintosh 
2287cb174861Sjoyce mcintosh /*
2288cb174861Sjoyce mcintosh  * This threshold mechanism can be used to limit the number of simultaneous
2289cb174861Sjoyce mcintosh  * requests, which serves to limit the stress that can be applied to the
2290cb174861Sjoyce mcintosh  * service and also allows the service to respond to requests before the
2291cb174861Sjoyce mcintosh  * client times out and reports that the server is not responding,
2292cb174861Sjoyce mcintosh  *
2293cb174861Sjoyce mcintosh  * If the number of requests exceeds the threshold, new requests will be
2294cb174861Sjoyce mcintosh  * stalled until the number drops back to the threshold.  Stalled requests
2295cb174861Sjoyce mcintosh  * will be notified as appropriate, in which case 0 will be returned.
2296cb174861Sjoyce mcintosh  * If the timeout expires before the request is notified, a non-zero errno
2297cb174861Sjoyce mcintosh  * value will be returned.
2298cb174861Sjoyce mcintosh  *
2299cb174861Sjoyce mcintosh  * To avoid a flood of messages, the message rate is throttled as well.
2300cb174861Sjoyce mcintosh  */
2301cb174861Sjoyce mcintosh int
2302cb174861Sjoyce mcintosh smb_threshold_enter(smb_cmd_threshold_t *ct)
2303cb174861Sjoyce mcintosh {
2304cb174861Sjoyce mcintosh 	int	rc;
2305cb174861Sjoyce mcintosh 
2306cb174861Sjoyce mcintosh 	mutex_enter(&ct->ct_mutex);
2307cb174861Sjoyce mcintosh 	if (ct->ct_active_cnt >= ct->ct_threshold && ct->ct_event != NULL) {
2308cb174861Sjoyce mcintosh 		atomic_inc_32(&ct->ct_blocked_cnt);
2309cb174861Sjoyce mcintosh 
2310cb174861Sjoyce mcintosh 		if (smb_threshold_debug) {
2311cb174861Sjoyce mcintosh 			cmn_err(CE_NOTE, "smb_threshold_enter[%s]: blocked "
2312cb174861Sjoyce mcintosh 			    "(blocked ops: %u, inflight ops: %u)",
2313cb174861Sjoyce mcintosh 			    ct->ct_cmd, ct->ct_blocked_cnt, ct->ct_active_cnt);
2314cb174861Sjoyce mcintosh 		}
2315cb174861Sjoyce mcintosh 
2316cb174861Sjoyce mcintosh 		mutex_exit(&ct->ct_mutex);
2317cb174861Sjoyce mcintosh 
2318cb174861Sjoyce mcintosh 		if ((rc = smb_event_wait(ct->ct_event)) != 0) {
2319cb174861Sjoyce mcintosh 			if (rc == ECANCELED)
2320cb174861Sjoyce mcintosh 				return (rc);
2321cb174861Sjoyce mcintosh 
2322cb174861Sjoyce mcintosh 			mutex_enter(&ct->ct_mutex);
2323cb174861Sjoyce mcintosh 			if (ct->ct_active_cnt >= ct->ct_threshold) {
2324cb174861Sjoyce mcintosh 
2325cb174861Sjoyce mcintosh 				if ((ct->ct_error_cnt %
2326cb174861Sjoyce mcintosh 				    SMB_THRESHOLD_REPORT_THROTTLE) == 0) {
2327cb174861Sjoyce mcintosh 					cmn_err(CE_NOTE, "%s: server busy: "
2328cb174861Sjoyce mcintosh 					    "threshold %d exceeded)",
2329cb174861Sjoyce mcintosh 					    ct->ct_cmd, ct->ct_threshold);
2330cb174861Sjoyce mcintosh 				}
2331cb174861Sjoyce mcintosh 
2332cb174861Sjoyce mcintosh 				atomic_inc_32(&ct->ct_error_cnt);
2333cb174861Sjoyce mcintosh 				mutex_exit(&ct->ct_mutex);
2334cb174861Sjoyce mcintosh 				return (rc);
2335cb174861Sjoyce mcintosh 			}
2336cb174861Sjoyce mcintosh 
2337cb174861Sjoyce mcintosh 			mutex_exit(&ct->ct_mutex);
2338cb174861Sjoyce mcintosh 
2339cb174861Sjoyce mcintosh 		}
2340cb174861Sjoyce mcintosh 
2341cb174861Sjoyce mcintosh 		mutex_enter(&ct->ct_mutex);
2342cb174861Sjoyce mcintosh 		atomic_dec_32(&ct->ct_blocked_cnt);
2343cb174861Sjoyce mcintosh 		if (smb_threshold_debug) {
2344cb174861Sjoyce mcintosh 			cmn_err(CE_NOTE, "smb_threshold_enter[%s]: resumed "
2345cb174861Sjoyce mcintosh 			    "(blocked ops: %u, inflight ops: %u)", ct->ct_cmd,
2346cb174861Sjoyce mcintosh 			    ct->ct_blocked_cnt, ct->ct_active_cnt);
2347cb174861Sjoyce mcintosh 		}
2348cb174861Sjoyce mcintosh 	}
2349cb174861Sjoyce mcintosh 
2350cb174861Sjoyce mcintosh 	atomic_inc_32(&ct->ct_active_cnt);
2351cb174861Sjoyce mcintosh 	mutex_exit(&ct->ct_mutex);
2352cb174861Sjoyce mcintosh 	return (0);
2353cb174861Sjoyce mcintosh }
2354cb174861Sjoyce mcintosh 
2355cb174861Sjoyce mcintosh void
2356cb174861Sjoyce mcintosh smb_threshold_exit(smb_cmd_threshold_t *ct, smb_server_t *sv)
2357cb174861Sjoyce mcintosh {
2358cb174861Sjoyce mcintosh 	mutex_enter(&ct->ct_mutex);
2359cb174861Sjoyce mcintosh 	atomic_dec_32(&ct->ct_active_cnt);
2360cb174861Sjoyce mcintosh 	mutex_exit(&ct->ct_mutex);
2361cb174861Sjoyce mcintosh 	smb_event_notify(sv, ct->ct_event_id);
2362cb174861Sjoyce mcintosh }
2363