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