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 */
21c13be35aSGordon Ross
229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
23c5866007SKeyur Desai * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
24b819cea2SGordon Ross * Copyright 2013 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/time.h>
32148c5f43SAlan Wright #include <sys/spl.h>
33148c5f43SAlan Wright #include <sys/random.h>
349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_kproto.h>
359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_fsops.h>
369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smbinfo.h>
379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_xdr.h>
389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_vops.h>
399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_idmap.h>
409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <sys/sid.h>
429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <sys/priv_names.h>
439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
448622ec45SGordon Ross static kmem_cache_t *smb_dtor_cache = NULL;
459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
46148c5f43SAlan Wright static boolean_t smb_avl_hold(smb_avl_t *);
47148c5f43SAlan Wright static void smb_avl_rele(smb_avl_t *);
48148c5f43SAlan Wright
499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States time_t tzh_leapcnt = 0;
509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States struct tm
529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *smb_gmtime_r(time_t *clock, struct tm *result);
539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States time_t
559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_timegm(struct tm *tm);
569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States struct tm {
589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int tm_sec;
599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int tm_min;
609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int tm_hour;
619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int tm_mday;
629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int tm_mon;
639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int tm_year;
649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int tm_wday;
659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int tm_yday;
669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int tm_isdst;
679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States };
689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
698622ec45SGordon Ross static const int days_in_month[] = {
709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States };
729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int
smb_ascii_or_unicode_strlen(struct smb_request * sr,char * str)749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_ascii_or_unicode_strlen(struct smb_request *sr, char *str)
759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (sr->smb_flg2 & SMB_FLAGS2_UNICODE)
779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (smb_wcequiv_strlen(str));
789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (strlen(str));
799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int
smb_ascii_or_unicode_strlen_null(struct smb_request * sr,char * str)829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_ascii_or_unicode_strlen_null(struct smb_request *sr, char *str)
839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (sr->smb_flg2 & SMB_FLAGS2_UNICODE)
859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (smb_wcequiv_strlen(str) + 2);
869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (strlen(str) + 1);
879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int
smb_ascii_or_unicode_null_len(struct smb_request * sr)909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_ascii_or_unicode_null_len(struct smb_request *sr)
919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (sr->smb_flg2 & SMB_FLAGS2_UNICODE)
939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (2);
949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (1);
959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
99c13be35aSGordon Ross * Convert old-style (DOS, LanMan) wildcard strings to NT style.
100c13be35aSGordon Ross * This should ONLY happen to patterns that come from old clients,
101c13be35aSGordon Ross * meaning dialect LANMAN2_1 etc. (dialect < NT_LM_0_12).
1029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
1039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * ? is converted to >
1049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * * is converted to < if it is followed by .
105c13be35aSGordon Ross * . is converted to " if it is followed by ? or * or end of pattern
1069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
107c13be35aSGordon Ross * Note: modifies pattern in place.
1089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
1099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
smb_convert_wildcards(char * pattern)1109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_convert_wildcards(char *pattern)
1119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
1129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char *p;
1139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
114c13be35aSGordon Ross for (p = pattern; *p != '\0'; p++) {
1159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States switch (*p) {
116c13be35aSGordon Ross case '?':
117c13be35aSGordon Ross *p = '>';
1189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break;
119c13be35aSGordon Ross case '*':
120c13be35aSGordon Ross if (p[1] == '.')
121c13be35aSGordon Ross *p = '<';
1229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break;
123c13be35aSGordon Ross case '.':
124c13be35aSGordon Ross if (p[1] == '?' || p[1] == '*' || p[1] == '\0')
125c13be35aSGordon Ross *p = '\"';
1269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break;
1279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
1289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
1299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
1309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
1319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
1329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_sattr_check
1339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
1349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Check file attributes against a search attribute (sattr) mask.
1359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
1369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Normal files, which includes READONLY and ARCHIVE, always pass
1379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * this check. If the DIRECTORY, HIDDEN or SYSTEM special attributes
1389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * are set then they must appear in the search mask. The special
1399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * attributes are inclusive, i.e. all special attributes that appear
1409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * in sattr must also appear in the file attributes for the check to
1419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * pass.
1429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
1439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * The following examples show how this works:
1449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
1459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * fileA: READONLY
1469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * fileB: 0 (no attributes = normal file)
1479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * fileC: READONLY, ARCHIVE
1489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * fileD: HIDDEN
1499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * fileE: READONLY, HIDDEN, SYSTEM
1509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * dirA: DIRECTORY
1519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
1529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * search attribute: 0
1539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Returns: fileA, fileB and fileC.
1549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * search attribute: HIDDEN
1559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Returns: fileA, fileB, fileC and fileD.
1569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * search attribute: SYSTEM
1579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Returns: fileA, fileB and fileC.
1589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * search attribute: DIRECTORY
1599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Returns: fileA, fileB, fileC and dirA.
1609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * search attribute: HIDDEN and SYSTEM
1619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Returns: fileA, fileB, fileC, fileD and fileE.
1629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
1639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Returns true if the file and sattr match; otherwise, returns false.
1649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
1659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States boolean_t
smb_sattr_check(uint16_t dosattr,uint16_t sattr)1669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_sattr_check(uint16_t dosattr, uint16_t sattr)
1679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
1689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((dosattr & FILE_ATTRIBUTE_DIRECTORY) &&
1699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States !(sattr & FILE_ATTRIBUTE_DIRECTORY))
1709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (B_FALSE);
1719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
1729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((dosattr & FILE_ATTRIBUTE_HIDDEN) &&
1739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States !(sattr & FILE_ATTRIBUTE_HIDDEN))
1749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (B_FALSE);
1759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
1769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((dosattr & FILE_ATTRIBUTE_SYSTEM) &&
1779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States !(sattr & FILE_ATTRIBUTE_SYSTEM))
1789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (B_FALSE);
1799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
1809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (B_TRUE);
1819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
1829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
1839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int
microtime(timestruc_t * tvp)1849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States microtime(timestruc_t *tvp)
1859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
1869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States tvp->tv_sec = gethrestime_sec();
1879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States tvp->tv_nsec = 0;
1889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (0);
1899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
1909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
1919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int32_t
clock_get_milli_uptime()1929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States clock_get_milli_uptime()
1939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
1949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (TICK_TO_MSEC(ddi_get_lbolt()));
1959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
1969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
1979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
1989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_idpool_increment
1999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
2009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * This function increments the ID pool by doubling the current size. This
2019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * function assumes the caller entered the mutex of the pool.
2029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
2039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
smb_idpool_increment(smb_idpool_t * pool)2049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_idpool_increment(
2059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_idpool_t *pool)
2069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
2079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint8_t *new_pool;
2089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t new_size;
2099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
2109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ASSERT(pool->id_magic == SMB_IDPOOL_MAGIC);
2119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
2129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States new_size = pool->id_size * 2;
2139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (new_size <= SMB_IDPOOL_MAX_SIZE) {
2149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States new_pool = kmem_alloc(new_size / 8, KM_NOSLEEP);
2159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (new_pool) {
2169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bzero(new_pool, new_size / 8);
2179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bcopy(pool->id_pool, new_pool, pool->id_size / 8);
2189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States kmem_free(pool->id_pool, pool->id_size / 8);
2199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pool->id_pool = new_pool;
2209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pool->id_free_counter += new_size - pool->id_size;
2219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pool->id_max_free_counter += new_size - pool->id_size;
2229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pool->id_size = new_size;
2239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pool->id_idx_msk = (new_size / 8) - 1;
2249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (new_size >= SMB_IDPOOL_MAX_SIZE) {
2259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* id -1 made unavailable */
2269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pool->id_pool[pool->id_idx_msk] = 0x80;
2279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pool->id_free_counter--;
2289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pool->id_max_free_counter--;
2299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
2309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (0);
2319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
2329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
2339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (-1);
2349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
2359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
2369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
2379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_idpool_constructor
2389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
2399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * This function initializes the pool structure provided.
2409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
2419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int
smb_idpool_constructor(smb_idpool_t * pool)2429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_idpool_constructor(
2439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_idpool_t *pool)
2449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
2459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
2469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ASSERT(pool->id_magic != SMB_IDPOOL_MAGIC);
2479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
2489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pool->id_size = SMB_IDPOOL_MIN_SIZE;
2499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pool->id_idx_msk = (SMB_IDPOOL_MIN_SIZE / 8) - 1;
2509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pool->id_free_counter = SMB_IDPOOL_MIN_SIZE - 1;
2519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pool->id_max_free_counter = SMB_IDPOOL_MIN_SIZE - 1;
2529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pool->id_bit = 0x02;
2539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pool->id_bit_idx = 1;
2549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pool->id_idx = 0;
2559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pool->id_pool = (uint8_t *)kmem_alloc((SMB_IDPOOL_MIN_SIZE / 8),
2569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States KM_SLEEP);
2579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bzero(pool->id_pool, (SMB_IDPOOL_MIN_SIZE / 8));
2589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* -1 id made unavailable */
2599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pool->id_pool[0] = 0x01; /* id 0 made unavailable */
2609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_init(&pool->id_mutex, NULL, MUTEX_DEFAULT, NULL);
2619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pool->id_magic = SMB_IDPOOL_MAGIC;
2629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (0);
2639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
2649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
2659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
2669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_idpool_destructor
2679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
2689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * This function tears down and frees the resources associated with the
2699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * pool provided.
2709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
2719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
smb_idpool_destructor(smb_idpool_t * pool)2729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_idpool_destructor(
2739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_idpool_t *pool)
2749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
2759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ASSERT(pool->id_magic == SMB_IDPOOL_MAGIC);
2769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ASSERT(pool->id_free_counter == pool->id_max_free_counter);
2779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pool->id_magic = (uint32_t)~SMB_IDPOOL_MAGIC;
2789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_destroy(&pool->id_mutex);
2799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States kmem_free(pool->id_pool, (size_t)(pool->id_size / 8));
2809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
2819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
2829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
2839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_idpool_alloc
2849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
2859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * This function allocates an ID from the pool provided.
2869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
2879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int
smb_idpool_alloc(smb_idpool_t * pool,uint16_t * id)2889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_idpool_alloc(
2899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_idpool_t *pool,
2909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint16_t *id)
2919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
2929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t i;
2939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint8_t bit;
2949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint8_t bit_idx;
2959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint8_t byte;
2969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
2979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ASSERT(pool->id_magic == SMB_IDPOOL_MAGIC);
2989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
2999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_enter(&pool->id_mutex);
3009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((pool->id_free_counter == 0) && smb_idpool_increment(pool)) {
3019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_exit(&pool->id_mutex);
3029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (-1);
3039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
3049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
3059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States i = pool->id_size;
3069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States while (i) {
3079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bit = pool->id_bit;
3089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bit_idx = pool->id_bit_idx;
3099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States byte = pool->id_pool[pool->id_idx];
3109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States while (bit) {
3119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (byte & bit) {
3129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bit = bit << 1;
3139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bit_idx++;
3149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States continue;
3159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
3169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pool->id_pool[pool->id_idx] |= bit;
3179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *id = (uint16_t)(pool->id_idx * 8 + (uint32_t)bit_idx);
3189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pool->id_free_counter--;
3199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pool->id_bit = bit;
3209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pool->id_bit_idx = bit_idx;
3219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_exit(&pool->id_mutex);
3229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (0);
3239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
3249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pool->id_bit = 1;
3259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pool->id_bit_idx = 0;
3269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pool->id_idx++;
3279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pool->id_idx &= pool->id_idx_msk;
3289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States --i;
3299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
3309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
3319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * This section of code shouldn't be reached. If there are IDs
3329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * available and none could be found there's a problem.
3339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
3349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ASSERT(0);
3359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_exit(&pool->id_mutex);
3369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (-1);
3379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
3389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
3399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
3409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_idpool_free
3419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
3429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * This function frees the ID provided.
3439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
3449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
smb_idpool_free(smb_idpool_t * pool,uint16_t id)3459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_idpool_free(
3469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_idpool_t *pool,
3479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint16_t id)
3489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
3499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ASSERT(pool->id_magic == SMB_IDPOOL_MAGIC);
3509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ASSERT(id != 0);
3519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ASSERT(id != 0xFFFF);
3529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
3539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_enter(&pool->id_mutex);
3549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (pool->id_pool[id >> 3] & (1 << (id & 7))) {
3559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pool->id_pool[id >> 3] &= ~(1 << (id & 7));
3569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pool->id_free_counter++;
3579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ASSERT(pool->id_free_counter <= pool->id_max_free_counter);
3589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_exit(&pool->id_mutex);
3599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return;
3609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
3619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /* Freeing a free ID. */
3629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ASSERT(0);
3639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_exit(&pool->id_mutex);
3649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
3659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
3669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
3679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Initialize the llist delete queue object cache.
3689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
3699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
smb_llist_init(void)3709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_init(void)
3719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
3728622ec45SGordon Ross if (smb_dtor_cache != NULL)
3739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return;
3749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
3759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_dtor_cache = kmem_cache_create("smb_dtor_cache",
3769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sizeof (smb_dtor_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
3779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
3789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
3799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
3809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Destroy the llist delete queue object cache.
3819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
3829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
smb_llist_fini(void)3839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_fini(void)
3849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
3858622ec45SGordon Ross if (smb_dtor_cache != NULL) {
3869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States kmem_cache_destroy(smb_dtor_cache);
3878622ec45SGordon Ross smb_dtor_cache = NULL;
3888622ec45SGordon Ross }
3899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
3909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
3919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
3929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_llist_constructor
3939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
3949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * This function initializes a locked list.
3959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
3969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
smb_llist_constructor(smb_llist_t * ll,size_t size,size_t offset)3979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_constructor(
3989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_t *ll,
3999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States size_t size,
4009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States size_t offset)
4019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
4029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rw_init(&ll->ll_lock, NULL, RW_DEFAULT, NULL);
4039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_init(&ll->ll_mutex, NULL, MUTEX_DEFAULT, NULL);
4049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_create(&ll->ll_list, size, offset);
4059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_create(&ll->ll_deleteq, sizeof (smb_dtor_t),
4069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States offsetof(smb_dtor_t, dt_lnd));
4079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ll->ll_count = 0;
4089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ll->ll_wrop = 0;
4099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ll->ll_deleteq_count = 0;
410cb174861Sjoyce mcintosh ll->ll_flushing = B_FALSE;
4119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
4129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
4139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
4149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Flush the delete queue and destroy a locked list.
4159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
4169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
smb_llist_destructor(smb_llist_t * ll)4179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_destructor(
4189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_t *ll)
4199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
4209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_flush(ll);
4219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
4229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ASSERT(ll->ll_count == 0);
4239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ASSERT(ll->ll_deleteq_count == 0);
4249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
4259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rw_destroy(&ll->ll_lock);
4269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_destroy(&ll->ll_list);
4279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_destroy(&ll->ll_deleteq);
4289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_destroy(&ll->ll_mutex);
4299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
4309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
4319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
4329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Post an object to the delete queue. The delete queue will be processed
4339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * during list exit or list destruction. Objects are often posted for
4349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * deletion during list iteration (while the list is locked) but that is
4359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * not required, and an object can be posted at any time.
4369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
4379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
smb_llist_post(smb_llist_t * ll,void * object,smb_dtorproc_t dtorproc)4389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_post(smb_llist_t *ll, void *object, smb_dtorproc_t dtorproc)
4399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
4409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_dtor_t *dtor;
4419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
4429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ASSERT((object != NULL) && (dtorproc != NULL));
4439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
4449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dtor = kmem_cache_alloc(smb_dtor_cache, KM_SLEEP);
4459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bzero(dtor, sizeof (smb_dtor_t));
4469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dtor->dt_magic = SMB_DTOR_MAGIC;
4479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dtor->dt_object = object;
4489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dtor->dt_proc = dtorproc;
4499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
4509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_enter(&ll->ll_mutex);
4519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_insert_tail(&ll->ll_deleteq, dtor);
4529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ++ll->ll_deleteq_count;
4539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_exit(&ll->ll_mutex);
4549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
4559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
4569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
4579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Exit the list lock and process the delete queue.
4589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
4599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
smb_llist_exit(smb_llist_t * ll)4609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_exit(smb_llist_t *ll)
4619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
4629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rw_exit(&ll->ll_lock);
4639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_flush(ll);
4649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
4659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
4669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
4679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Flush the list delete queue. The mutex is dropped across the destructor
4689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * call in case this leads to additional objects being posted to the delete
4699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * queue.
4709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
471c5866007SKeyur Desai void
smb_llist_flush(smb_llist_t * ll)4729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_flush(smb_llist_t *ll)
4739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
4749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_dtor_t *dtor;
4759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
4769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_enter(&ll->ll_mutex);
477cb174861Sjoyce mcintosh if (ll->ll_flushing) {
478cb174861Sjoyce mcintosh mutex_exit(&ll->ll_mutex);
479cb174861Sjoyce mcintosh return;
480cb174861Sjoyce mcintosh }
481cb174861Sjoyce mcintosh ll->ll_flushing = B_TRUE;
4829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
4839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dtor = list_head(&ll->ll_deleteq);
4849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States while (dtor != NULL) {
4859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States SMB_DTOR_VALID(dtor);
4869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ASSERT((dtor->dt_object != NULL) && (dtor->dt_proc != NULL));
4879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_remove(&ll->ll_deleteq, dtor);
4889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States --ll->ll_deleteq_count;
4899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_exit(&ll->ll_mutex);
4909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
4919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dtor->dt_proc(dtor->dt_object);
4929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
4939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dtor->dt_magic = (uint32_t)~SMB_DTOR_MAGIC;
4949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States kmem_cache_free(smb_dtor_cache, dtor);
4959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_enter(&ll->ll_mutex);
4969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dtor = list_head(&ll->ll_deleteq);
4979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
498cb174861Sjoyce mcintosh ll->ll_flushing = B_FALSE;
4999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
5009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_exit(&ll->ll_mutex);
5019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
5029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
5039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
5049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_llist_upgrade
5059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
5069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * This function tries to upgrade the lock of the locked list. It assumes the
5079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * locked has already been entered in RW_READER mode. It first tries using the
5089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Solaris function rw_tryupgrade(). If that call fails the lock is released
5099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * and reentered in RW_WRITER mode. In that last case a window is opened during
5109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * which the contents of the list may have changed. The return code indicates
5119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * whether or not the list was modified when the lock was exited.
5129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
smb_llist_upgrade(smb_llist_t * ll)5139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int smb_llist_upgrade(
5149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_t *ll)
5159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
5169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint64_t wrop;
5179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
5189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (rw_tryupgrade(&ll->ll_lock) != 0) {
5199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (0);
5209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
5219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States wrop = ll->ll_wrop;
5229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rw_exit(&ll->ll_lock);
5239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rw_enter(&ll->ll_lock, RW_WRITER);
5249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (wrop != ll->ll_wrop);
5259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
5269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
5279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
5289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_llist_insert_head
5299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
5309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * This function inserts the object passed a the beginning of the list. This
5319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * function assumes the lock of the list has already been entered.
5329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
5339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
smb_llist_insert_head(smb_llist_t * ll,void * obj)5349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_insert_head(
5359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_t *ll,
5369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void *obj)
5379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
5389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_insert_head(&ll->ll_list, obj);
5399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ++ll->ll_wrop;
5409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ++ll->ll_count;
5419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
5429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
5439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
5449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_llist_insert_tail
5459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
5469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * This function appends to the object passed to the list. This function assumes
5479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * the lock of the list has already been entered.
5489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
5499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
5509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
smb_llist_insert_tail(smb_llist_t * ll,void * obj)5519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_insert_tail(
5529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_t *ll,
5539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void *obj)
5549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
5559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_insert_tail(&ll->ll_list, obj);
5569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ++ll->ll_wrop;
5579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ++ll->ll_count;
5589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
5599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
5609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
5619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_llist_remove
5629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
5639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * This function removes the object passed from the list. This function assumes
5649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * the lock of the list has already been entered.
5659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
5669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
smb_llist_remove(smb_llist_t * ll,void * obj)5679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_remove(
5689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_t *ll,
5699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void *obj)
5709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
5719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_remove(&ll->ll_list, obj);
5729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ++ll->ll_wrop;
5739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States --ll->ll_count;
5749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
5759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
5769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
5779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_llist_get_count
5789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
5799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * This function returns the number of elements in the specified list.
5809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
5819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t
smb_llist_get_count(smb_llist_t * ll)5829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_get_count(
5839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_t *ll)
5849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
5859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (ll->ll_count);
5869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
5879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
5889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
5899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_slist_constructor
5909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
5919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Synchronized list constructor.
5929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
5939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
smb_slist_constructor(smb_slist_t * sl,size_t size,size_t offset)5949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_slist_constructor(
5959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_slist_t *sl,
5969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States size_t size,
5979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States size_t offset)
5989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
5999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_init(&sl->sl_mutex, NULL, MUTEX_DEFAULT, NULL);
6009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States cv_init(&sl->sl_cv, NULL, CV_DEFAULT, NULL);
6019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_create(&sl->sl_list, size, offset);
6029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sl->sl_count = 0;
6039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sl->sl_waiting = B_FALSE;
6049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
6059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
6069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
6079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_slist_destructor
6089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
6099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Synchronized list destructor.
6109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
6119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
smb_slist_destructor(smb_slist_t * sl)6129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_slist_destructor(
6139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_slist_t *sl)
6149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
615148c5f43SAlan Wright VERIFY(sl->sl_count == 0);
6169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
6179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_destroy(&sl->sl_mutex);
6189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States cv_destroy(&sl->sl_cv);
6199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_destroy(&sl->sl_list);
6209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
6219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
6229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
6239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_slist_insert_head
6249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
6259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * This function inserts the object passed a the beginning of the list.
6269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
6279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
smb_slist_insert_head(smb_slist_t * sl,void * obj)6289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_slist_insert_head(
6299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_slist_t *sl,
6309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void *obj)
6319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
6329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_enter(&sl->sl_mutex);
6339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_insert_head(&sl->sl_list, obj);
6349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ++sl->sl_count;
6359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_exit(&sl->sl_mutex);
6369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
6379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
6389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
6399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_slist_insert_tail
6409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
6419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * This function appends the object passed to the list.
6429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
6439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
smb_slist_insert_tail(smb_slist_t * sl,void * obj)6449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_slist_insert_tail(
6459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_slist_t *sl,
6469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void *obj)
6479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
6489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_enter(&sl->sl_mutex);
6499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_insert_tail(&sl->sl_list, obj);
6509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ++sl->sl_count;
6519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_exit(&sl->sl_mutex);
6529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
6539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
6549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
6559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_llist_remove
6569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
6579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * This function removes the object passed by the caller from the list.
6589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
6599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
smb_slist_remove(smb_slist_t * sl,void * obj)6609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_slist_remove(
6619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_slist_t *sl,
6629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void *obj)
6639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
6649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_enter(&sl->sl_mutex);
6659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_remove(&sl->sl_list, obj);
6669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((--sl->sl_count == 0) && (sl->sl_waiting)) {
6679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sl->sl_waiting = B_FALSE;
6689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States cv_broadcast(&sl->sl_cv);
6699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
6709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_exit(&sl->sl_mutex);
6719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
6729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
6739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
6749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_slist_move_tail
6759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
6769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * This function transfers all the contents of the synchronized list to the
6779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * list_t provided. It returns the number of objects transferred.
6789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
6799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t
smb_slist_move_tail(list_t * lst,smb_slist_t * sl)6809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_slist_move_tail(
6819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_t *lst,
6829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_slist_t *sl)
6839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
6849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t rv;
6859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
6869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_enter(&sl->sl_mutex);
6879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rv = sl->sl_count;
6889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (sl->sl_count) {
6899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_move_tail(lst, &sl->sl_list);
6909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sl->sl_count = 0;
6919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (sl->sl_waiting) {
6929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sl->sl_waiting = B_FALSE;
6939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States cv_broadcast(&sl->sl_cv);
6949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
6959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
6969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_exit(&sl->sl_mutex);
6979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (rv);
6989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
6999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
7009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
7019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_slist_obj_move
7029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
7039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * This function moves an object from one list to the end of the other list. It
7049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * assumes the mutex of each list has been entered.
7059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
7069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
smb_slist_obj_move(smb_slist_t * dst,smb_slist_t * src,void * obj)7079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_slist_obj_move(
7089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_slist_t *dst,
7099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_slist_t *src,
7109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void *obj)
7119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
7129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ASSERT(dst->sl_list.list_offset == src->sl_list.list_offset);
7139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ASSERT(dst->sl_list.list_size == src->sl_list.list_size);
7149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
7159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_remove(&src->sl_list, obj);
7169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States list_insert_tail(&dst->sl_list, obj);
7179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dst->sl_count++;
7189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States src->sl_count--;
7199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((src->sl_count == 0) && (src->sl_waiting)) {
7209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States src->sl_waiting = B_FALSE;
7219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States cv_broadcast(&src->sl_cv);
7229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
7239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
7249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
7259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
7269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_slist_wait_for_empty
7279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
7289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * This function waits for a list to be emptied.
7299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
7309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
smb_slist_wait_for_empty(smb_slist_t * sl)7319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_slist_wait_for_empty(
7329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_slist_t *sl)
7339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
7349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_enter(&sl->sl_mutex);
7359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States while (sl->sl_count) {
7369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sl->sl_waiting = B_TRUE;
7379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States cv_wait(&sl->sl_cv, &sl->sl_mutex);
7389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
7399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_exit(&sl->sl_mutex);
7409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
7419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
7429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
7439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_slist_exit
7449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
7459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * This function exits the muetx of the list and signal the condition variable
7469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * if the list is empty.
7479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
7489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
smb_slist_exit(smb_slist_t * sl)7499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_slist_exit(smb_slist_t *sl)
7509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
7519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((sl->sl_count == 0) && (sl->sl_waiting)) {
7529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sl->sl_waiting = B_FALSE;
7539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States cv_broadcast(&sl->sl_cv);
7549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
7559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_exit(&sl->sl_mutex);
7569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
7579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
758b819cea2SGordon Ross /* smb_thread_... moved to smb_thread.c */
7599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
7609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
7619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_rwx_init
7629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
7639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
smb_rwx_init(smb_rwx_t * rwx)7649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_rwx_init(
7659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_rwx_t *rwx)
7669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
7679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bzero(rwx, sizeof (smb_rwx_t));
7689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States cv_init(&rwx->rwx_cv, NULL, CV_DEFAULT, NULL);
7699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_init(&rwx->rwx_mutex, NULL, MUTEX_DEFAULT, NULL);
7709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rw_init(&rwx->rwx_lock, NULL, RW_DEFAULT, NULL);
7719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
7729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
7739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
7749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_rwx_destroy
7759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
7769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
smb_rwx_destroy(smb_rwx_t * rwx)7779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_rwx_destroy(
7789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_rwx_t *rwx)
7799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
7809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_destroy(&rwx->rwx_mutex);
7819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States cv_destroy(&rwx->rwx_cv);
7829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rw_destroy(&rwx->rwx_lock);
7839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
7849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
7859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
7869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_rwx_rwexit
7879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
7889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
smb_rwx_rwexit(smb_rwx_t * rwx)7899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_rwx_rwexit(
7909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_rwx_t *rwx)
7919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
7929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (rw_write_held(&rwx->rwx_lock)) {
7939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ASSERT(rw_owner(&rwx->rwx_lock) == curthread);
7949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_enter(&rwx->rwx_mutex);
7959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (rwx->rwx_waiting) {
7969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rwx->rwx_waiting = B_FALSE;
7979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States cv_broadcast(&rwx->rwx_cv);
7989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
7999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_exit(&rwx->rwx_mutex);
8009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
8019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rw_exit(&rwx->rwx_lock);
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_rwx_rwupgrade
8069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
8079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States krw_t
smb_rwx_rwupgrade(smb_rwx_t * rwx)8089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_rwx_rwupgrade(
8099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_rwx_t *rwx)
8109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
8119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (rw_write_held(&rwx->rwx_lock)) {
8129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ASSERT(rw_owner(&rwx->rwx_lock) == curthread);
8139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (RW_WRITER);
8149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
8159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (!rw_tryupgrade(&rwx->rwx_lock)) {
8169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rw_exit(&rwx->rwx_lock);
8179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rw_enter(&rwx->rwx_lock, RW_WRITER);
8189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
8199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (RW_READER);
8209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
8219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
8229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
8239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_rwx_rwrestore
8249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
8259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
smb_rwx_rwdowngrade(smb_rwx_t * rwx,krw_t mode)8269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_rwx_rwdowngrade(
8279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_rwx_t *rwx,
8289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States krw_t mode)
8299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
8309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ASSERT(rw_write_held(&rwx->rwx_lock));
8319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ASSERT(rw_owner(&rwx->rwx_lock) == curthread);
8329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
8339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (mode == RW_WRITER) {
8349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return;
8359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
8369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ASSERT(mode == RW_READER);
8379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_enter(&rwx->rwx_mutex);
8389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (rwx->rwx_waiting) {
8399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rwx->rwx_waiting = B_FALSE;
8409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States cv_broadcast(&rwx->rwx_cv);
8419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
8429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_exit(&rwx->rwx_mutex);
8439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rw_downgrade(&rwx->rwx_lock);
8449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
8459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
8469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
8479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_rwx_wait
8489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
8499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * This function assumes the smb_rwx lock was enter in RW_READER or RW_WRITER
8509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * mode. It will:
8519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
8529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 1) release the lock and save its current mode.
8539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 2) wait until the condition variable is signaled. This can happen for
8549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 2 reasons: When a writer releases the lock or when the time out (if
8559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * provided) expires.
8569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * 3) re-acquire the lock in the mode saved in (1).
8579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
8589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int
smb_rwx_rwwait(smb_rwx_t * rwx,clock_t timeout)8599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_rwx_rwwait(
8609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_rwx_t *rwx,
8619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States clock_t timeout)
8629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
8639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States krw_t mode;
864b819cea2SGordon Ross int rc = 1;
8659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
8669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_enter(&rwx->rwx_mutex);
8679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rwx->rwx_waiting = B_TRUE;
8689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_exit(&rwx->rwx_mutex);
8699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
8709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (rw_write_held(&rwx->rwx_lock)) {
8719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ASSERT(rw_owner(&rwx->rwx_lock) == curthread);
8729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mode = RW_WRITER;
8739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } else {
8749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ASSERT(rw_read_held(&rwx->rwx_lock));
8759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mode = RW_READER;
8769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
8779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rw_exit(&rwx->rwx_lock);
8789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
8799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_enter(&rwx->rwx_mutex);
8809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (rwx->rwx_waiting) {
8819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (timeout == -1) {
8829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States cv_wait(&rwx->rwx_cv, &rwx->rwx_mutex);
8839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } else {
8849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rc = cv_reltimedwait(&rwx->rwx_cv, &rwx->rwx_mutex,
8859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States timeout, TR_CLOCK_TICK);
8869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
8879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
8889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States mutex_exit(&rwx->rwx_mutex);
8899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
8909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States rw_enter(&rwx->rwx_lock, mode);
8919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (rc);
8929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
8939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
894b819cea2SGordon Ross /* smb_idmap_... moved to smb_idmap.c */
8959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
8969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint64_t
smb_time_unix_to_nt(timestruc_t * unix_time)8979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_time_unix_to_nt(timestruc_t *unix_time)
8989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
8999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint64_t nt_time;
9009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
9019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((unix_time->tv_sec == 0) && (unix_time->tv_nsec == 0))
9029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (0);
9039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
9049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States nt_time = unix_time->tv_sec;
9059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States nt_time *= 10000000; /* seconds to 100ns */
9069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States nt_time += unix_time->tv_nsec / 100;
9079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (nt_time + NT_TIME_BIAS);
9089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
9099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
9109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
smb_time_nt_to_unix(uint64_t nt_time,timestruc_t * unix_time)9119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_time_nt_to_unix(uint64_t nt_time, timestruc_t *unix_time)
9129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
9139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t seconds;
9149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
9159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ASSERT(unix_time);
9169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
9179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((nt_time == 0) || (nt_time == -1)) {
9189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States unix_time->tv_sec = 0;
9199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States unix_time->tv_nsec = 0;
9209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return;
9219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
9229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
923*b6f078edSGordon Ross /*
924*b6f078edSGordon Ross * Can't represent times less than or equal NT_TIME_BIAS,
925*b6f078edSGordon Ross * so convert them to the oldest date we can store.
926*b6f078edSGordon Ross * Note that time zero is "special" being converted
927*b6f078edSGordon Ross * both directions as 0:0 (unix-to-nt, nt-to-unix).
928*b6f078edSGordon Ross */
929*b6f078edSGordon Ross if (nt_time <= NT_TIME_BIAS) {
930*b6f078edSGordon Ross unix_time->tv_sec = 0;
931*b6f078edSGordon Ross unix_time->tv_nsec = 100;
932*b6f078edSGordon Ross return;
933*b6f078edSGordon Ross }
934*b6f078edSGordon Ross
9359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States nt_time -= NT_TIME_BIAS;
9369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States seconds = nt_time / 10000000;
9379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States unix_time->tv_sec = seconds;
9389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States unix_time->tv_nsec = (nt_time % 10000000) * 100;
9399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
9409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
9419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
9429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_time_gmt_to_local, smb_time_local_to_gmt
9439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
9449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Apply the gmt offset to convert between local time and gmt
9459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
9469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int32_t
smb_time_gmt_to_local(smb_request_t * sr,int32_t gmt)9479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_time_gmt_to_local(smb_request_t *sr, int32_t gmt)
9489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
9499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((gmt == 0) || (gmt == -1))
9509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (0);
9519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
9529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (gmt - sr->sr_gmtoff);
9539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
9549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
9559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int32_t
smb_time_local_to_gmt(smb_request_t * sr,int32_t local)9569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_time_local_to_gmt(smb_request_t *sr, int32_t local)
9579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
9589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if ((local == 0) || (local == -1))
9599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (0);
9609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
9619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (local + sr->sr_gmtoff);
9629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
9639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
9649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
9659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
9669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_time_dos_to_unix
9679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
9689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Convert SMB_DATE & SMB_TIME values to a unix timestamp.
9699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
9709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * A date/time field of 0 means that that server file system
9719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * assigned value need not be changed. The behaviour when the
9729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * date/time field is set to -1 is not documented but is
9739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * generally treated like 0.
9749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * If date or time is 0 or -1 the unix time is returned as 0
9759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * so that the caller can identify and handle this special case.
9769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
9779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int32_t
smb_time_dos_to_unix(int16_t date,int16_t time)9789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_time_dos_to_unix(int16_t date, int16_t time)
9799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
9809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States struct tm atm;
9819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
9829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (((date == 0) || (time == 0)) ||
9839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ((date == -1) || (time == -1))) {
9849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (0);
9859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
9869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
9879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States atm.tm_year = ((date >> 9) & 0x3F) + 80;
9889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States atm.tm_mon = ((date >> 5) & 0x0F) - 1;
9899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States atm.tm_mday = ((date >> 0) & 0x1F);
9909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States atm.tm_hour = ((time >> 11) & 0x1F);
9919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States atm.tm_min = ((time >> 5) & 0x3F);
9929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States atm.tm_sec = ((time >> 0) & 0x1F) << 1;
9939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
9949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (smb_timegm(&atm));
9959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
9969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
9979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
smb_time_unix_to_dos(int32_t ux_time,int16_t * date_p,int16_t * time_p)9989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_time_unix_to_dos(int32_t ux_time, int16_t *date_p, int16_t *time_p)
9999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
10009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States struct tm atm;
10019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int i;
10029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States time_t tmp_time;
10039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
10049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (ux_time == 0) {
10059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *date_p = 0;
10069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *time_p = 0;
10079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return;
10089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
10099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
10109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States tmp_time = (time_t)ux_time;
10119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) smb_gmtime_r(&tmp_time, &atm);
10129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
10139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (date_p) {
10149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States i = 0;
10159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States i += atm.tm_year - 80;
10169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States i <<= 4;
10179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States i += atm.tm_mon + 1;
10189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States i <<= 5;
10199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States i += atm.tm_mday;
10209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
10219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *date_p = (short)i;
10229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
10239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (time_p) {
10249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States i = 0;
10259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States i += atm.tm_hour;
10269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States i <<= 6;
10279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States i += atm.tm_min;
10289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States i <<= 5;
10299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States i += atm.tm_sec >> 1;
10309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
10319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *time_p = (short)i;
10329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
10339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
10349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
10359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
10369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
10379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_gmtime_r
10389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
10399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Thread-safe version of smb_gmtime. Returns a null pointer if either
10409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * input parameter is a null pointer. Otherwise returns a pointer
10419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * to result.
10429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
10439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Day of the week calculation: the Epoch was a thursday.
10449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
10459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * There are no timezone corrections so tm_isdst and tm_gmtoff are
10469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * always zero, and the zone is always WET.
10479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
10489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States struct tm *
smb_gmtime_r(time_t * clock,struct tm * result)10499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_gmtime_r(time_t *clock, struct tm *result)
10509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
10519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States time_t tsec;
10529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int year;
10539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int month;
10549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int sec_per_month;
10559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
10569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (clock == 0 || result == 0)
10579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (0);
10589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
10599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States bzero(result, sizeof (struct tm));
10609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States tsec = *clock;
10619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States tsec -= tzh_leapcnt;
10629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
10639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States result->tm_wday = tsec / SECSPERDAY;
10649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States result->tm_wday = (result->tm_wday + TM_THURSDAY) % DAYSPERWEEK;
10659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
10669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States year = EPOCH_YEAR;
10679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States while (tsec >= (isleap(year) ? (SECSPERDAY * DAYSPERLYEAR) :
10689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (SECSPERDAY * DAYSPERNYEAR))) {
10699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (isleap(year))
10709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States tsec -= SECSPERDAY * DAYSPERLYEAR;
10719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States else
10729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States tsec -= SECSPERDAY * DAYSPERNYEAR;
10739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
10749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States ++year;
10759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
10769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
10779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States result->tm_year = year - TM_YEAR_BASE;
10789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States result->tm_yday = tsec / SECSPERDAY;
10799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
10809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States for (month = TM_JANUARY; month <= TM_DECEMBER; ++month) {
10819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sec_per_month = days_in_month[month] * SECSPERDAY;
10829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
10839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (month == TM_FEBRUARY && isleap(year))
10849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States sec_per_month += SECSPERDAY;
10859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
10869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (tsec < sec_per_month)
10879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States break;
10889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
10899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States tsec -= sec_per_month;
10909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
10919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
10929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States result->tm_mon = month;
10939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States result->tm_mday = (tsec / SECSPERDAY) + 1;
10949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States tsec %= SECSPERDAY;
10959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States result->tm_sec = tsec % 60;
10969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States tsec /= 60;
10979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States result->tm_min = tsec % 60;
10989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States tsec /= 60;
10999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States result->tm_hour = (int)tsec;
11009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
11019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (result);
11029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
11039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
11049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
11059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
11069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_timegm
11079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
11089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Converts the broken-down time in tm to a time value, i.e. the number
11099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * of seconds since the Epoch (00:00:00 UTC, January 1, 1970). This is
11109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * not a POSIX or ANSI function. Per the man page, the input values of
11119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * tm_wday and tm_yday are ignored and, as the input data is assumed to
11129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * represent GMT, we force tm_isdst and tm_gmtoff to 0.
11139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
11149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Before returning the clock time, we use smb_gmtime_r to set up tm_wday
11159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * and tm_yday, and bring the other fields within normal range. I don't
11169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * think this is really how it should be done but it's convenient for
11179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * now.
11189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
11199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States time_t
smb_timegm(struct tm * tm)11209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_timegm(struct tm *tm)
11219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
11229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States time_t tsec;
11239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int dd;
11249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int mm;
11259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int yy;
11269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States int year;
11279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
11289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (tm == 0)
11299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (-1);
11309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
11319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States year = tm->tm_year + TM_YEAR_BASE;
11329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States tsec = tzh_leapcnt;
11339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
11349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States for (yy = EPOCH_YEAR; yy < year; ++yy) {
11359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (isleap(yy))
11369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States tsec += SECSPERDAY * DAYSPERLYEAR;
11379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States else
11389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States tsec += SECSPERDAY * DAYSPERNYEAR;
11399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
11409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
11419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States for (mm = TM_JANUARY; mm < tm->tm_mon; ++mm) {
11429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dd = days_in_month[mm] * SECSPERDAY;
11439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
11449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (mm == TM_FEBRUARY && isleap(year))
11459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States dd += SECSPERDAY;
11469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
11479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States tsec += dd;
11489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
11499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
11509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States tsec += (tm->tm_mday - 1) * SECSPERDAY;
11519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States tsec += tm->tm_sec;
11529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States tsec += tm->tm_min * SECSPERMIN;
11539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States tsec += tm->tm_hour * SECSPERHOUR;
11549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
11559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States tm->tm_isdst = 0;
11569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States (void) smb_gmtime_r(&tsec, tm);
11579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (tsec);
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_pad_align
11629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
11639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Returns the number of bytes required to pad an offset to the
11649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * specified alignment.
11659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
11669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t
smb_pad_align(uint32_t offset,uint32_t align)11679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_pad_align(uint32_t offset, uint32_t align)
11689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
11699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t pad = offset % align;
11709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
11719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States if (pad != 0)
11729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States pad = align - pad;
11739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
11749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States return (pad);
11759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
11769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States
11779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
11789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * smb_panic
11799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States *
11809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * Logs the file name, function name and line number passed in and panics the
11819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States * system.
11829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States */
11839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
smb_panic(char * file,const char * func,int line)11849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_panic(char *file, const char *func, int line)
11859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
11869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States cmn_err(CE_PANIC, "%s:%s:%d\n", file, func, line);
11879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
1188148c5f43SAlan Wright
1189148c5f43SAlan Wright /*
1190148c5f43SAlan Wright * Creates an AVL tree and initializes the given smb_avl_t
1191148c5f43SAlan Wright * structure using the passed args
1192148c5f43SAlan Wright */
1193148c5f43SAlan Wright void
smb_avl_create(smb_avl_t * avl,size_t size,size_t offset,const smb_avl_nops_t * ops)11948622ec45SGordon Ross smb_avl_create(smb_avl_t *avl, size_t size, size_t offset,
11958622ec45SGordon Ross const smb_avl_nops_t *ops)
1196148c5f43SAlan Wright {
1197148c5f43SAlan Wright ASSERT(avl);
1198148c5f43SAlan Wright ASSERT(ops);
1199148c5f43SAlan Wright
1200148c5f43SAlan Wright rw_init(&avl->avl_lock, NULL, RW_DEFAULT, NULL);
1201148c5f43SAlan Wright mutex_init(&avl->avl_mutex, NULL, MUTEX_DEFAULT, NULL);
1202148c5f43SAlan Wright
1203148c5f43SAlan Wright avl->avl_nops = ops;
1204148c5f43SAlan Wright avl->avl_state = SMB_AVL_STATE_READY;
1205148c5f43SAlan Wright avl->avl_refcnt = 0;
1206148c5f43SAlan Wright (void) random_get_pseudo_bytes((uint8_t *)&avl->avl_sequence,
1207148c5f43SAlan Wright sizeof (uint32_t));
1208148c5f43SAlan Wright
1209148c5f43SAlan Wright avl_create(&avl->avl_tree, ops->avln_cmp, size, offset);
1210148c5f43SAlan Wright }
1211148c5f43SAlan Wright
1212148c5f43SAlan Wright /*
1213148c5f43SAlan Wright * Destroys the specified AVL tree.
1214148c5f43SAlan Wright * It waits for all the in-flight operations to finish
1215148c5f43SAlan Wright * before destroying the AVL.
1216148c5f43SAlan Wright */
1217148c5f43SAlan Wright void
smb_avl_destroy(smb_avl_t * avl)1218148c5f43SAlan Wright smb_avl_destroy(smb_avl_t *avl)
1219148c5f43SAlan Wright {
1220148c5f43SAlan Wright void *cookie = NULL;
1221148c5f43SAlan Wright void *node;
1222148c5f43SAlan Wright
1223148c5f43SAlan Wright ASSERT(avl);
1224148c5f43SAlan Wright
1225148c5f43SAlan Wright mutex_enter(&avl->avl_mutex);
1226148c5f43SAlan Wright if (avl->avl_state != SMB_AVL_STATE_READY) {
1227148c5f43SAlan Wright mutex_exit(&avl->avl_mutex);
1228148c5f43SAlan Wright return;
1229148c5f43SAlan Wright }
1230148c5f43SAlan Wright
1231148c5f43SAlan Wright avl->avl_state = SMB_AVL_STATE_DESTROYING;
1232148c5f43SAlan Wright
1233148c5f43SAlan Wright while (avl->avl_refcnt > 0)
1234148c5f43SAlan Wright (void) cv_wait(&avl->avl_cv, &avl->avl_mutex);
1235148c5f43SAlan Wright mutex_exit(&avl->avl_mutex);
1236148c5f43SAlan Wright
1237148c5f43SAlan Wright rw_enter(&avl->avl_lock, RW_WRITER);
1238148c5f43SAlan Wright while ((node = avl_destroy_nodes(&avl->avl_tree, &cookie)) != NULL)
1239148c5f43SAlan Wright avl->avl_nops->avln_destroy(node);
1240148c5f43SAlan Wright
1241148c5f43SAlan Wright avl_destroy(&avl->avl_tree);
1242148c5f43SAlan Wright rw_exit(&avl->avl_lock);
1243148c5f43SAlan Wright
1244148c5f43SAlan Wright rw_destroy(&avl->avl_lock);
1245148c5f43SAlan Wright
1246148c5f43SAlan Wright mutex_destroy(&avl->avl_mutex);
1247148c5f43SAlan Wright bzero(avl, sizeof (smb_avl_t));
1248148c5f43SAlan Wright }
1249148c5f43SAlan Wright
1250148c5f43SAlan Wright /*
1251148c5f43SAlan Wright * Adds the given item to the AVL if it's
1252148c5f43SAlan Wright * not already there.
1253148c5f43SAlan Wright *
1254148c5f43SAlan Wright * Returns:
1255148c5f43SAlan Wright *
1256148c5f43SAlan Wright * ENOTACTIVE AVL is not in READY state
1257148c5f43SAlan Wright * EEXIST The item is already in AVL
1258148c5f43SAlan Wright */
1259148c5f43SAlan Wright int
smb_avl_add(smb_avl_t * avl,void * item)1260148c5f43SAlan Wright smb_avl_add(smb_avl_t *avl, void *item)
1261148c5f43SAlan Wright {
1262148c5f43SAlan Wright avl_index_t where;
1263148c5f43SAlan Wright
1264148c5f43SAlan Wright ASSERT(avl);
1265148c5f43SAlan Wright ASSERT(item);
1266148c5f43SAlan Wright
1267148c5f43SAlan Wright if (!smb_avl_hold(avl))
1268148c5f43SAlan Wright return (ENOTACTIVE);
1269148c5f43SAlan Wright
1270148c5f43SAlan Wright rw_enter(&avl->avl_lock, RW_WRITER);
1271148c5f43SAlan Wright if (avl_find(&avl->avl_tree, item, &where) != NULL) {
1272148c5f43SAlan Wright rw_exit(&avl->avl_lock);
1273148c5f43SAlan Wright smb_avl_rele(avl);
1274148c5f43SAlan Wright return (EEXIST);
1275148c5f43SAlan Wright }
1276148c5f43SAlan Wright
1277148c5f43SAlan Wright avl_insert(&avl->avl_tree, item, where);
1278148c5f43SAlan Wright avl->avl_sequence++;
1279148c5f43SAlan Wright rw_exit(&avl->avl_lock);
1280148c5f43SAlan Wright
1281148c5f43SAlan Wright smb_avl_rele(avl);
1282148c5f43SAlan Wright return (0);
1283148c5f43SAlan Wright }
1284148c5f43SAlan Wright
1285148c5f43SAlan Wright /*
1286148c5f43SAlan Wright * Removes the given item from the AVL.
1287148c5f43SAlan Wright * If no reference is left on the item
1288148c5f43SAlan Wright * it will also be destroyed by calling the
1289148c5f43SAlan Wright * registered destroy operation.
1290148c5f43SAlan Wright */
1291148c5f43SAlan Wright void
smb_avl_remove(smb_avl_t * avl,void * item)1292148c5f43SAlan Wright smb_avl_remove(smb_avl_t *avl, void *item)
1293148c5f43SAlan Wright {
1294148c5f43SAlan Wright avl_index_t where;
1295148c5f43SAlan Wright void *rm_item;
1296148c5f43SAlan Wright
1297148c5f43SAlan Wright ASSERT(avl);
1298148c5f43SAlan Wright ASSERT(item);
1299148c5f43SAlan Wright
1300148c5f43SAlan Wright if (!smb_avl_hold(avl))
1301148c5f43SAlan Wright return;
1302148c5f43SAlan Wright
1303148c5f43SAlan Wright rw_enter(&avl->avl_lock, RW_WRITER);
1304148c5f43SAlan Wright if ((rm_item = avl_find(&avl->avl_tree, item, &where)) == NULL) {
1305148c5f43SAlan Wright rw_exit(&avl->avl_lock);
1306148c5f43SAlan Wright smb_avl_rele(avl);
1307148c5f43SAlan Wright return;
1308148c5f43SAlan Wright }
1309148c5f43SAlan Wright
1310148c5f43SAlan Wright avl_remove(&avl->avl_tree, rm_item);
1311148c5f43SAlan Wright if (avl->avl_nops->avln_rele(rm_item))
1312148c5f43SAlan Wright avl->avl_nops->avln_destroy(rm_item);
1313148c5f43SAlan Wright avl->avl_sequence++;
1314148c5f43SAlan Wright rw_exit(&avl->avl_lock);
1315148c5f43SAlan Wright
1316148c5f43SAlan Wright smb_avl_rele(avl);
1317148c5f43SAlan Wright }
1318148c5f43SAlan Wright
1319148c5f43SAlan Wright /*
1320148c5f43SAlan Wright * Looks up the AVL for the given item.
1321148c5f43SAlan Wright * If the item is found a hold on the object
1322148c5f43SAlan Wright * is taken before the pointer to it is
1323148c5f43SAlan Wright * returned to the caller. The caller MUST
1324148c5f43SAlan Wright * always call smb_avl_release() after it's done
1325148c5f43SAlan Wright * using the returned object to release the hold
1326148c5f43SAlan Wright * taken on the object.
1327148c5f43SAlan Wright */
1328148c5f43SAlan Wright void *
smb_avl_lookup(smb_avl_t * avl,void * item)1329148c5f43SAlan Wright smb_avl_lookup(smb_avl_t *avl, void *item)
1330148c5f43SAlan Wright {
1331148c5f43SAlan Wright void *node = NULL;
1332148c5f43SAlan Wright
1333148c5f43SAlan Wright ASSERT(avl);
1334148c5f43SAlan Wright ASSERT(item);
1335148c5f43SAlan Wright
1336148c5f43SAlan Wright if (!smb_avl_hold(avl))
1337148c5f43SAlan Wright return (NULL);
1338148c5f43SAlan Wright
1339148c5f43SAlan Wright rw_enter(&avl->avl_lock, RW_READER);
1340148c5f43SAlan Wright node = avl_find(&avl->avl_tree, item, NULL);
1341148c5f43SAlan Wright if (node != NULL)
1342148c5f43SAlan Wright avl->avl_nops->avln_hold(node);
1343148c5f43SAlan Wright rw_exit(&avl->avl_lock);
1344148c5f43SAlan Wright
1345148c5f43SAlan Wright if (node == NULL)
1346148c5f43SAlan Wright smb_avl_rele(avl);
1347148c5f43SAlan Wright
1348148c5f43SAlan Wright return (node);
1349148c5f43SAlan Wright }
1350148c5f43SAlan Wright
1351148c5f43SAlan Wright /*
1352148c5f43SAlan Wright * The hold on the given object is released.
1353148c5f43SAlan Wright * This function MUST always be called after
1354148c5f43SAlan Wright * smb_avl_lookup() and smb_avl_iterate() for
1355148c5f43SAlan Wright * the returned object.
1356148c5f43SAlan Wright *
1357148c5f43SAlan Wright * If AVL is in DESTROYING state, the destroying
1358148c5f43SAlan Wright * thread will be notified.
1359148c5f43SAlan Wright */
1360148c5f43SAlan Wright void
smb_avl_release(smb_avl_t * avl,void * item)1361148c5f43SAlan Wright smb_avl_release(smb_avl_t *avl, void *item)
1362148c5f43SAlan Wright {
1363148c5f43SAlan Wright ASSERT(avl);
1364148c5f43SAlan Wright ASSERT(item);
1365148c5f43SAlan Wright
1366148c5f43SAlan Wright if (avl->avl_nops->avln_rele(item))
1367148c5f43SAlan Wright avl->avl_nops->avln_destroy(item);
1368148c5f43SAlan Wright
1369148c5f43SAlan Wright smb_avl_rele(avl);
1370148c5f43SAlan Wright }
1371148c5f43SAlan Wright
1372148c5f43SAlan Wright /*
1373148c5f43SAlan Wright * Initializes the given cursor for the AVL.
1374148c5f43SAlan Wright * The cursor will be used to iterate through the AVL
1375148c5f43SAlan Wright */
1376148c5f43SAlan Wright void
smb_avl_iterinit(smb_avl_t * avl,smb_avl_cursor_t * cursor)1377148c5f43SAlan Wright smb_avl_iterinit(smb_avl_t *avl, smb_avl_cursor_t *cursor)
1378148c5f43SAlan Wright {
1379148c5f43SAlan Wright ASSERT(avl);
1380148c5f43SAlan Wright ASSERT(cursor);
1381148c5f43SAlan Wright
1382148c5f43SAlan Wright cursor->avlc_next = NULL;
1383148c5f43SAlan Wright cursor->avlc_sequence = avl->avl_sequence;
1384148c5f43SAlan Wright }
1385148c5f43SAlan Wright
1386148c5f43SAlan Wright /*
1387148c5f43SAlan Wright * Iterates through the AVL using the given cursor.
1388148c5f43SAlan Wright * It always starts at the beginning and then returns
1389148c5f43SAlan Wright * a pointer to the next object on each subsequent call.
1390148c5f43SAlan Wright *
1391148c5f43SAlan Wright * If a new object is added to or removed from the AVL
1392148c5f43SAlan Wright * between two calls to this function, the iteration
1393148c5f43SAlan Wright * will terminate prematurely.
1394148c5f43SAlan Wright *
1395148c5f43SAlan Wright * The caller MUST always call smb_avl_release() after it's
1396148c5f43SAlan Wright * done using the returned object to release the hold taken
1397148c5f43SAlan Wright * on the object.
1398148c5f43SAlan Wright */
1399148c5f43SAlan Wright void *
smb_avl_iterate(smb_avl_t * avl,smb_avl_cursor_t * cursor)1400148c5f43SAlan Wright smb_avl_iterate(smb_avl_t *avl, smb_avl_cursor_t *cursor)
1401148c5f43SAlan Wright {
1402148c5f43SAlan Wright void *node;
1403148c5f43SAlan Wright
1404148c5f43SAlan Wright ASSERT(avl);
1405148c5f43SAlan Wright ASSERT(cursor);
1406148c5f43SAlan Wright
1407148c5f43SAlan Wright if (!smb_avl_hold(avl))
1408148c5f43SAlan Wright return (NULL);
1409148c5f43SAlan Wright
1410148c5f43SAlan Wright rw_enter(&avl->avl_lock, RW_READER);
1411148c5f43SAlan Wright if (cursor->avlc_sequence != avl->avl_sequence) {
1412148c5f43SAlan Wright rw_exit(&avl->avl_lock);
1413148c5f43SAlan Wright smb_avl_rele(avl);
1414148c5f43SAlan Wright return (NULL);
1415148c5f43SAlan Wright }
1416148c5f43SAlan Wright
1417148c5f43SAlan Wright if (cursor->avlc_next == NULL)
1418148c5f43SAlan Wright node = avl_first(&avl->avl_tree);
1419148c5f43SAlan Wright else
1420148c5f43SAlan Wright node = AVL_NEXT(&avl->avl_tree, cursor->avlc_next);
1421148c5f43SAlan Wright
1422148c5f43SAlan Wright if (node != NULL)
1423148c5f43SAlan Wright avl->avl_nops->avln_hold(node);
1424148c5f43SAlan Wright
1425148c5f43SAlan Wright cursor->avlc_next = node;
1426148c5f43SAlan Wright rw_exit(&avl->avl_lock);
1427148c5f43SAlan Wright
1428148c5f43SAlan Wright if (node == NULL)
1429148c5f43SAlan Wright smb_avl_rele(avl);
1430148c5f43SAlan Wright
1431148c5f43SAlan Wright return (node);
1432148c5f43SAlan Wright }
1433148c5f43SAlan Wright
1434148c5f43SAlan Wright /*
1435148c5f43SAlan Wright * Increments the AVL reference count in order to
1436148c5f43SAlan Wright * prevent the avl from being destroyed while it's
1437148c5f43SAlan Wright * being accessed.
1438148c5f43SAlan Wright */
1439148c5f43SAlan Wright static boolean_t
smb_avl_hold(smb_avl_t * avl)1440148c5f43SAlan Wright smb_avl_hold(smb_avl_t *avl)
1441148c5f43SAlan Wright {
1442148c5f43SAlan Wright mutex_enter(&avl->avl_mutex);
1443148c5f43SAlan Wright if (avl->avl_state != SMB_AVL_STATE_READY) {
1444148c5f43SAlan Wright mutex_exit(&avl->avl_mutex);
1445148c5f43SAlan Wright return (B_FALSE);
1446148c5f43SAlan Wright }
1447148c5f43SAlan Wright avl->avl_refcnt++;
1448148c5f43SAlan Wright mutex_exit(&avl->avl_mutex);
1449148c5f43SAlan Wright
1450148c5f43SAlan Wright return (B_TRUE);
1451148c5f43SAlan Wright }
1452148c5f43SAlan Wright
1453148c5f43SAlan Wright /*
1454148c5f43SAlan Wright * Decrements the AVL reference count to release the
1455148c5f43SAlan Wright * hold. If another thread is trying to destroy the
1456148c5f43SAlan Wright * AVL and is waiting for the reference count to become
1457148c5f43SAlan Wright * 0, it is signaled to wake up.
1458148c5f43SAlan Wright */
1459148c5f43SAlan Wright static void
smb_avl_rele(smb_avl_t * avl)1460148c5f43SAlan Wright smb_avl_rele(smb_avl_t *avl)
1461148c5f43SAlan Wright {
1462148c5f43SAlan Wright mutex_enter(&avl->avl_mutex);
1463148c5f43SAlan Wright ASSERT(avl->avl_refcnt > 0);
1464148c5f43SAlan Wright avl->avl_refcnt--;
1465148c5f43SAlan Wright if (avl->avl_state == SMB_AVL_STATE_DESTROYING)
1466148c5f43SAlan Wright cv_broadcast(&avl->avl_cv);
1467148c5f43SAlan Wright mutex_exit(&avl->avl_mutex);
1468148c5f43SAlan Wright }
1469148c5f43SAlan Wright
1470148c5f43SAlan Wright /*
1471148c5f43SAlan Wright * smb_latency_init
1472148c5f43SAlan Wright */
1473148c5f43SAlan Wright void
smb_latency_init(smb_latency_t * lat)1474148c5f43SAlan Wright smb_latency_init(smb_latency_t *lat)
1475148c5f43SAlan Wright {
1476148c5f43SAlan Wright bzero(lat, sizeof (*lat));
1477148c5f43SAlan Wright mutex_init(&lat->ly_mutex, NULL, MUTEX_SPIN, (void *)ipltospl(SPL7));
1478148c5f43SAlan Wright }
1479148c5f43SAlan Wright
1480148c5f43SAlan Wright /*
1481148c5f43SAlan Wright * smb_latency_destroy
1482148c5f43SAlan Wright */
1483148c5f43SAlan Wright void
smb_latency_destroy(smb_latency_t * lat)1484148c5f43SAlan Wright smb_latency_destroy(smb_latency_t *lat)
1485148c5f43SAlan Wright {
1486148c5f43SAlan Wright mutex_destroy(&lat->ly_mutex);
1487148c5f43SAlan Wright }
1488148c5f43SAlan Wright
1489148c5f43SAlan Wright /*
1490148c5f43SAlan Wright * smb_latency_add_sample
1491148c5f43SAlan Wright *
1492148c5f43SAlan Wright * Uses the new sample to calculate the new mean and standard deviation. The
1493148c5f43SAlan Wright * sample must be a scaled value.
1494148c5f43SAlan Wright */
1495148c5f43SAlan Wright void
smb_latency_add_sample(smb_latency_t * lat,hrtime_t sample)1496148c5f43SAlan Wright smb_latency_add_sample(smb_latency_t *lat, hrtime_t sample)
1497148c5f43SAlan Wright {
1498148c5f43SAlan Wright hrtime_t a_mean;
1499148c5f43SAlan Wright hrtime_t d_mean;
1500148c5f43SAlan Wright
1501148c5f43SAlan Wright mutex_enter(&lat->ly_mutex);
1502148c5f43SAlan Wright lat->ly_a_nreq++;
1503148c5f43SAlan Wright lat->ly_a_sum += sample;
1504148c5f43SAlan Wright if (lat->ly_a_nreq != 0) {
1505148c5f43SAlan Wright a_mean = lat->ly_a_sum / lat->ly_a_nreq;
1506148c5f43SAlan Wright lat->ly_a_stddev =
1507148c5f43SAlan Wright (sample - a_mean) * (sample - lat->ly_a_mean);
1508148c5f43SAlan Wright lat->ly_a_mean = a_mean;
1509148c5f43SAlan Wright }
1510148c5f43SAlan Wright lat->ly_d_nreq++;
1511148c5f43SAlan Wright lat->ly_d_sum += sample;
1512148c5f43SAlan Wright if (lat->ly_d_nreq != 0) {
1513148c5f43SAlan Wright d_mean = lat->ly_d_sum / lat->ly_d_nreq;
1514148c5f43SAlan Wright lat->ly_d_stddev =
1515148c5f43SAlan Wright (sample - d_mean) * (sample - lat->ly_d_mean);
1516148c5f43SAlan Wright lat->ly_d_mean = d_mean;
1517148c5f43SAlan Wright }
1518148c5f43SAlan Wright mutex_exit(&lat->ly_mutex);
1519148c5f43SAlan Wright }
1520148c5f43SAlan Wright
1521148c5f43SAlan Wright /*
1522148c5f43SAlan Wright * smb_srqueue_init
1523148c5f43SAlan Wright */
1524148c5f43SAlan Wright void
smb_srqueue_init(smb_srqueue_t * srq)1525148c5f43SAlan Wright smb_srqueue_init(smb_srqueue_t *srq)
1526148c5f43SAlan Wright {
1527148c5f43SAlan Wright bzero(srq, sizeof (*srq));
1528148c5f43SAlan Wright mutex_init(&srq->srq_mutex, NULL, MUTEX_SPIN, (void *)ipltospl(SPL7));
1529148c5f43SAlan Wright srq->srq_wlastupdate = srq->srq_rlastupdate = gethrtime_unscaled();
1530148c5f43SAlan Wright }
1531148c5f43SAlan Wright
1532148c5f43SAlan Wright /*
1533148c5f43SAlan Wright * smb_srqueue_destroy
1534148c5f43SAlan Wright */
1535148c5f43SAlan Wright void
smb_srqueue_destroy(smb_srqueue_t * srq)1536148c5f43SAlan Wright smb_srqueue_destroy(smb_srqueue_t *srq)
1537148c5f43SAlan Wright {
1538148c5f43SAlan Wright mutex_destroy(&srq->srq_mutex);
1539148c5f43SAlan Wright }
1540148c5f43SAlan Wright
1541148c5f43SAlan Wright /*
1542148c5f43SAlan Wright * smb_srqueue_waitq_enter
1543148c5f43SAlan Wright */
1544148c5f43SAlan Wright void
smb_srqueue_waitq_enter(smb_srqueue_t * srq)1545148c5f43SAlan Wright smb_srqueue_waitq_enter(smb_srqueue_t *srq)
1546148c5f43SAlan Wright {
1547148c5f43SAlan Wright hrtime_t new;
1548148c5f43SAlan Wright hrtime_t delta;
1549148c5f43SAlan Wright uint32_t wcnt;
1550148c5f43SAlan Wright
1551148c5f43SAlan Wright mutex_enter(&srq->srq_mutex);
1552148c5f43SAlan Wright new = gethrtime_unscaled();
1553148c5f43SAlan Wright delta = new - srq->srq_wlastupdate;
1554148c5f43SAlan Wright srq->srq_wlastupdate = new;
1555148c5f43SAlan Wright wcnt = srq->srq_wcnt++;
1556148c5f43SAlan Wright if (wcnt != 0) {
1557148c5f43SAlan Wright srq->srq_wlentime += delta * wcnt;
1558148c5f43SAlan Wright srq->srq_wtime += delta;
1559148c5f43SAlan Wright }
1560148c5f43SAlan Wright mutex_exit(&srq->srq_mutex);
1561148c5f43SAlan Wright }
1562148c5f43SAlan Wright
1563148c5f43SAlan Wright /*
1564148c5f43SAlan Wright * smb_srqueue_runq_exit
1565148c5f43SAlan Wright */
1566148c5f43SAlan Wright void
smb_srqueue_runq_exit(smb_srqueue_t * srq)1567148c5f43SAlan Wright smb_srqueue_runq_exit(smb_srqueue_t *srq)
1568148c5f43SAlan Wright {
1569148c5f43SAlan Wright hrtime_t new;
1570148c5f43SAlan Wright hrtime_t delta;
1571148c5f43SAlan Wright uint32_t rcnt;
1572148c5f43SAlan Wright
1573148c5f43SAlan Wright mutex_enter(&srq->srq_mutex);
1574148c5f43SAlan Wright new = gethrtime_unscaled();
1575148c5f43SAlan Wright delta = new - srq->srq_rlastupdate;
1576148c5f43SAlan Wright srq->srq_rlastupdate = new;
1577148c5f43SAlan Wright rcnt = srq->srq_rcnt--;
1578148c5f43SAlan Wright ASSERT(rcnt > 0);
1579148c5f43SAlan Wright srq->srq_rlentime += delta * rcnt;
1580148c5f43SAlan Wright srq->srq_rtime += delta;
1581148c5f43SAlan Wright mutex_exit(&srq->srq_mutex);
1582148c5f43SAlan Wright }
1583148c5f43SAlan Wright
1584148c5f43SAlan Wright /*
1585148c5f43SAlan Wright * smb_srqueue_waitq_to_runq
1586148c5f43SAlan Wright */
1587148c5f43SAlan Wright void
smb_srqueue_waitq_to_runq(smb_srqueue_t * srq)1588148c5f43SAlan Wright smb_srqueue_waitq_to_runq(smb_srqueue_t *srq)
1589148c5f43SAlan Wright {
1590148c5f43SAlan Wright hrtime_t new;
1591148c5f43SAlan Wright hrtime_t delta;
1592148c5f43SAlan Wright uint32_t wcnt;
1593148c5f43SAlan Wright uint32_t rcnt;
1594148c5f43SAlan Wright
1595148c5f43SAlan Wright mutex_enter(&srq->srq_mutex);
1596148c5f43SAlan Wright new = gethrtime_unscaled();
1597148c5f43SAlan Wright delta = new - srq->srq_wlastupdate;
1598148c5f43SAlan Wright srq->srq_wlastupdate = new;
1599148c5f43SAlan Wright wcnt = srq->srq_wcnt--;
1600148c5f43SAlan Wright ASSERT(wcnt > 0);
1601148c5f43SAlan Wright srq->srq_wlentime += delta * wcnt;
1602148c5f43SAlan Wright srq->srq_wtime += delta;
1603148c5f43SAlan Wright delta = new - srq->srq_rlastupdate;
1604148c5f43SAlan Wright srq->srq_rlastupdate = new;
1605148c5f43SAlan Wright rcnt = srq->srq_rcnt++;
1606148c5f43SAlan Wright if (rcnt != 0) {
1607148c5f43SAlan Wright srq->srq_rlentime += delta * rcnt;
1608148c5f43SAlan Wright srq->srq_rtime += delta;
1609148c5f43SAlan Wright }
1610148c5f43SAlan Wright mutex_exit(&srq->srq_mutex);
1611148c5f43SAlan Wright }
1612148c5f43SAlan Wright
1613148c5f43SAlan Wright /*
1614148c5f43SAlan Wright * smb_srqueue_update
1615148c5f43SAlan Wright *
1616148c5f43SAlan Wright * Takes a snapshot of the smb_sr_stat_t structure passed in.
1617148c5f43SAlan Wright */
1618148c5f43SAlan Wright void
smb_srqueue_update(smb_srqueue_t * srq,smb_kstat_utilization_t * kd)1619148c5f43SAlan Wright smb_srqueue_update(smb_srqueue_t *srq, smb_kstat_utilization_t *kd)
1620148c5f43SAlan Wright {
1621148c5f43SAlan Wright hrtime_t delta;
1622148c5f43SAlan Wright hrtime_t snaptime;
1623148c5f43SAlan Wright
1624148c5f43SAlan Wright mutex_enter(&srq->srq_mutex);
1625148c5f43SAlan Wright snaptime = gethrtime_unscaled();
1626148c5f43SAlan Wright delta = snaptime - srq->srq_wlastupdate;
1627148c5f43SAlan Wright srq->srq_wlastupdate = snaptime;
1628148c5f43SAlan Wright if (srq->srq_wcnt != 0) {
1629148c5f43SAlan Wright srq->srq_wlentime += delta * srq->srq_wcnt;
1630148c5f43SAlan Wright srq->srq_wtime += delta;
1631148c5f43SAlan Wright }
1632148c5f43SAlan Wright delta = snaptime - srq->srq_rlastupdate;
1633148c5f43SAlan Wright srq->srq_rlastupdate = snaptime;
1634148c5f43SAlan Wright if (srq->srq_rcnt != 0) {
1635148c5f43SAlan Wright srq->srq_rlentime += delta * srq->srq_rcnt;
1636148c5f43SAlan Wright srq->srq_rtime += delta;
1637148c5f43SAlan Wright }
1638148c5f43SAlan Wright kd->ku_rlentime = srq->srq_rlentime;
1639148c5f43SAlan Wright kd->ku_rtime = srq->srq_rtime;
1640148c5f43SAlan Wright kd->ku_wlentime = srq->srq_wlentime;
1641148c5f43SAlan Wright kd->ku_wtime = srq->srq_wtime;
1642148c5f43SAlan Wright mutex_exit(&srq->srq_mutex);
1643148c5f43SAlan Wright scalehrtime(&kd->ku_rlentime);
1644148c5f43SAlan Wright scalehrtime(&kd->ku_rtime);
1645148c5f43SAlan Wright scalehrtime(&kd->ku_wlentime);
1646148c5f43SAlan Wright scalehrtime(&kd->ku_wtime);
1647148c5f43SAlan Wright }
1648cb174861Sjoyce mcintosh
1649cb174861Sjoyce mcintosh void
smb_threshold_init(smb_cmd_threshold_t * ct,char * cmd,uint_t threshold,uint_t timeout)1650856399cfSGordon Ross smb_threshold_init(smb_cmd_threshold_t *ct, char *cmd,
1651856399cfSGordon Ross uint_t threshold, uint_t timeout)
1652cb174861Sjoyce mcintosh {
1653cb174861Sjoyce mcintosh bzero(ct, sizeof (smb_cmd_threshold_t));
1654cb174861Sjoyce mcintosh mutex_init(&ct->ct_mutex, NULL, MUTEX_DEFAULT, NULL);
1655856399cfSGordon Ross cv_init(&ct->ct_cond, NULL, CV_DEFAULT, NULL);
1656856399cfSGordon Ross
1657cb174861Sjoyce mcintosh ct->ct_cmd = cmd;
1658cb174861Sjoyce mcintosh ct->ct_threshold = threshold;
1659856399cfSGordon Ross ct->ct_timeout = timeout;
1660cb174861Sjoyce mcintosh }
1661cb174861Sjoyce mcintosh
1662cb174861Sjoyce mcintosh void
smb_threshold_fini(smb_cmd_threshold_t * ct)1663cb174861Sjoyce mcintosh smb_threshold_fini(smb_cmd_threshold_t *ct)
1664cb174861Sjoyce mcintosh {
1665856399cfSGordon Ross cv_destroy(&ct->ct_cond);
1666cb174861Sjoyce mcintosh mutex_destroy(&ct->ct_mutex);
1667cb174861Sjoyce mcintosh }
1668cb174861Sjoyce mcintosh
1669cb174861Sjoyce mcintosh /*
1670856399cfSGordon Ross * This threshold mechanism is used to limit the number of simultaneous
1671856399cfSGordon Ross * named pipe connections, concurrent authentication conversations, etc.
1672856399cfSGordon Ross * Requests that would take us over the threshold wait until either the
1673856399cfSGordon Ross * resources are available (return zero) or timeout (return error).
1674cb174861Sjoyce mcintosh */
1675cb174861Sjoyce mcintosh int
smb_threshold_enter(smb_cmd_threshold_t * ct)1676cb174861Sjoyce mcintosh smb_threshold_enter(smb_cmd_threshold_t *ct)
1677cb174861Sjoyce mcintosh {
1678856399cfSGordon Ross clock_t time, rem;
1679cb174861Sjoyce mcintosh
1680856399cfSGordon Ross time = MSEC_TO_TICK(ct->ct_timeout) + ddi_get_lbolt();
1681cb174861Sjoyce mcintosh mutex_enter(&ct->ct_mutex);
1682cb174861Sjoyce mcintosh
1683856399cfSGordon Ross while (ct->ct_threshold != 0 &&
1684856399cfSGordon Ross ct->ct_threshold <= ct->ct_active_cnt) {
1685856399cfSGordon Ross ct->ct_blocked_cnt++;
1686856399cfSGordon Ross rem = cv_timedwait(&ct->ct_cond, &ct->ct_mutex, time);
1687856399cfSGordon Ross ct->ct_blocked_cnt--;
1688856399cfSGordon Ross if (rem < 0) {
1689cb174861Sjoyce mcintosh mutex_exit(&ct->ct_mutex);
1690856399cfSGordon Ross return (ETIME);
1691cb174861Sjoyce mcintosh }
1692856399cfSGordon Ross }
1693856399cfSGordon Ross if (ct->ct_threshold == 0) {
1694cb174861Sjoyce mcintosh mutex_exit(&ct->ct_mutex);
1695856399cfSGordon Ross return (ECANCELED);
1696cb174861Sjoyce mcintosh }
1697cb174861Sjoyce mcintosh
1698856399cfSGordon Ross ASSERT3U(ct->ct_active_cnt, <, ct->ct_threshold);
1699856399cfSGordon Ross ct->ct_active_cnt++;
1700cb174861Sjoyce mcintosh
1701cb174861Sjoyce mcintosh mutex_exit(&ct->ct_mutex);
1702cb174861Sjoyce mcintosh return (0);
1703cb174861Sjoyce mcintosh }
1704cb174861Sjoyce mcintosh
1705cb174861Sjoyce mcintosh void
smb_threshold_exit(smb_cmd_threshold_t * ct)1706856399cfSGordon Ross smb_threshold_exit(smb_cmd_threshold_t *ct)
1707cb174861Sjoyce mcintosh {
1708cb174861Sjoyce mcintosh mutex_enter(&ct->ct_mutex);
1709856399cfSGordon Ross ASSERT3U(ct->ct_active_cnt, >, 0);
1710856399cfSGordon Ross ct->ct_active_cnt--;
1711856399cfSGordon Ross if (ct->ct_blocked_cnt)
1712856399cfSGordon Ross cv_signal(&ct->ct_cond);
1713cb174861Sjoyce mcintosh mutex_exit(&ct->ct_mutex);
1714856399cfSGordon Ross }
1715856399cfSGordon Ross
1716856399cfSGordon Ross void
smb_threshold_wake_all(smb_cmd_threshold_t * ct)1717856399cfSGordon Ross smb_threshold_wake_all(smb_cmd_threshold_t *ct)
1718856399cfSGordon Ross {
1719856399cfSGordon Ross mutex_enter(&ct->ct_mutex);
1720856399cfSGordon Ross ct->ct_threshold = 0;
1721856399cfSGordon Ross cv_broadcast(&ct->ct_cond);
1722856399cfSGordon Ross mutex_exit(&ct->ct_mutex);
1723cb174861Sjoyce mcintosh }
1724