1da6c28aaSamw /*
2da6c28aaSamw  * CDDL HEADER START
3da6c28aaSamw  *
4da6c28aaSamw  * The contents of this file are subject to the terms of the
5da6c28aaSamw  * Common Development and Distribution License (the "License").
6da6c28aaSamw  * You may not use this file except in compliance with the License.
7da6c28aaSamw  *
8da6c28aaSamw  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9da6c28aaSamw  * or http://www.opensolaris.org/os/licensing.
10da6c28aaSamw  * See the License for the specific language governing permissions
11da6c28aaSamw  * and limitations under the License.
12da6c28aaSamw  *
13da6c28aaSamw  * When distributing Covered Code, include this CDDL HEADER in each
14da6c28aaSamw  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15da6c28aaSamw  * If applicable, add the following below this CDDL HEADER, with the
16da6c28aaSamw  * fields enclosed by brackets "[]" replaced with your own identifying
17da6c28aaSamw  * information: Portions Copyright [yyyy] [name of copyright owner]
18da6c28aaSamw  *
19da6c28aaSamw  * CDDL HEADER END
20da6c28aaSamw  */
21da6c28aaSamw /*
22148c5f43SAlan Wright  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
23da6c28aaSamw  */
24da6c28aaSamw 
25*da90d5b8SJohn Levon /*
26*da90d5b8SJohn Levon  * Copyright 2019 Joyent, Inc.
27*da90d5b8SJohn Levon  */
28*da90d5b8SJohn Levon 
29da6c28aaSamw #include <sys/types.h>
30da6c28aaSamw #include <sys/sunddi.h>
31da6c28aaSamw #include <sys/kmem.h>
32da6c28aaSamw #include <sys/sysmacros.h>
33bbf6f00cSJordan Brown #include <smbsrv/smb_kproto.h>
34da6c28aaSamw #include <smbsrv/alloc.h>
35da6c28aaSamw 
369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define	SMB_SMH_MAGIC		0x534D485F	/* 'SMH_' */
379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define	SMB_SMH_VALID(_smh_)	ASSERT((_smh_)->smh_magic == SMB_SMH_MAGIC)
389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define	SMB_MEM2SMH(_mem_)	((smb_mem_header_t *)(_mem_) - 1)
39da6c28aaSamw 
409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States typedef struct smb_mem_header {
419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t	smh_magic;
429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	size_t		smh_size;
439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_request_t	*smh_sr;
449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_node_t	smh_lnd;
459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } smb_mem_header_t;
46da6c28aaSamw 
479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void *smb_alloc(smb_request_t *, size_t, boolean_t);
489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void smb_free(smb_request_t *, void *, boolean_t);
499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void *smb_realloc(smb_request_t *, void *, size_t, boolean_t);
50da6c28aaSamw 
519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Allocate memory.
539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void *
smb_mem_alloc(size_t size)559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_mem_alloc(size_t size)
569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (smb_alloc(NULL, size, B_FALSE));
58da6c28aaSamw }
59da6c28aaSamw 
609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Allocate memory and zero it out.
629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void *
smb_mem_zalloc(size_t size)649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_mem_zalloc(size_t size)
65da6c28aaSamw {
669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (smb_alloc(NULL, size, B_TRUE));
67da6c28aaSamw }
68da6c28aaSamw 
699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Allocate or resize memory previously allocated.
719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * The address passed in MUST be considered invalid when this function returns.
739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void *
smb_mem_realloc(void * ptr,size_t size)759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_mem_realloc(void *ptr, size_t size)
76da6c28aaSamw {
779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (smb_realloc(NULL, ptr, size, B_FALSE));
78da6c28aaSamw }
79da6c28aaSamw 
809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Allocate or resize memory previously allocated. If the new size is greater
829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * than the current size, the extra space is zeroed out. If the new size is less
839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * then the current size the space truncated is zeroed out.
849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * The address passed in MUST be considered invalid when this function returns.
869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
87da6c28aaSamw void *
smb_mem_rezalloc(void * ptr,size_t size)889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_mem_rezalloc(void *ptr, size_t size)
89da6c28aaSamw {
909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (smb_realloc(NULL, ptr, size, B_TRUE));
919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
92da6c28aaSamw 
939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Free memory previously allocated with smb_malloc(), smb_zalloc(),
959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_remalloc() or smb_rezalloc().
969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
smb_mem_free(void * ptr)989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_mem_free(void *ptr)
999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
1009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_free(NULL, ptr, B_FALSE);
101da6c28aaSamw }
102da6c28aaSamw 
1039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
1049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Free memory previously allocated with smb_mem_malloc(), smb_mem_zalloc(),
1059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_mem_remalloc() or smb_mem_rezalloc() or smb_mem_strdup(). The memory will
1069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * be zeroed out before being actually freed.
1079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
108da6c28aaSamw void
smb_mem_zfree(void * ptr)1099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_mem_zfree(void *ptr)
110da6c28aaSamw {
1119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_free(NULL, ptr, B_TRUE);
1129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
113da6c28aaSamw 
1149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
1159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Duplicate a string.
1169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
1179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States char *
smb_mem_strdup(const char * ptr)1189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_mem_strdup(const char *ptr)
1199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
1209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	char	*p;
1219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	size_t	size;
122da6c28aaSamw 
1239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	size = strlen(ptr) + 1;
1249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	p = smb_alloc(NULL, size, B_FALSE);
1259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bcopy(ptr, p, size);
1269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (p);
127da6c28aaSamw }
128bbf6f00cSJordan Brown 
129bbf6f00cSJordan Brown /*
130bbf6f00cSJordan Brown  * Initialize the list for request-specific temporary storage.
131bbf6f00cSJordan Brown  */
132bbf6f00cSJordan Brown void
smb_srm_init(smb_request_t * sr)133bbf6f00cSJordan Brown smb_srm_init(smb_request_t *sr)
134bbf6f00cSJordan Brown {
1359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_create(&sr->sr_storage, sizeof (smb_mem_header_t),
1369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    offsetof(smb_mem_header_t, smh_lnd));
137bbf6f00cSJordan Brown }
138bbf6f00cSJordan Brown 
139bbf6f00cSJordan Brown /*
1409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Free everything on the request-specific temporary storage list and destroy
1419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * the list.
142bbf6f00cSJordan Brown  */
143bbf6f00cSJordan Brown void
smb_srm_fini(smb_request_t * sr)144bbf6f00cSJordan Brown smb_srm_fini(smb_request_t *sr)
145bbf6f00cSJordan Brown {
1469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_mem_header_t	*smh;
147bbf6f00cSJordan Brown 
1489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	while ((smh = list_head(&sr->sr_storage)) != NULL)
1499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smb_free(sr, ++smh, B_FALSE);
150bbf6f00cSJordan Brown 	list_destroy(&sr->sr_storage);
151bbf6f00cSJordan Brown }
152bbf6f00cSJordan Brown 
153bbf6f00cSJordan Brown /*
154bbf6f00cSJordan Brown  * Allocate memory and associate it with the specified request.
1559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Memory allocated here can only be used for the duration of this request; it
1569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * will be freed automatically on completion of the request.
157bbf6f00cSJordan Brown  */
158bbf6f00cSJordan Brown void *
smb_srm_alloc(smb_request_t * sr,size_t size)159bbf6f00cSJordan Brown smb_srm_alloc(smb_request_t *sr, size_t size)
160bbf6f00cSJordan Brown {
1619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (smb_alloc(sr, size, B_FALSE));
1629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
163bbf6f00cSJordan Brown 
1649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
1659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Allocate memory, zero it out and associate it with the specified request.
1669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Memory allocated here can only be used for the duration of this request; it
1679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * will be freed automatically on completion of the request.
1689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
1699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void *
smb_srm_zalloc(smb_request_t * sr,size_t size)1709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_srm_zalloc(smb_request_t *sr, size_t size)
1719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
1729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (smb_alloc(sr, size, B_TRUE));
173bbf6f00cSJordan Brown }
174bbf6f00cSJordan Brown 
175bbf6f00cSJordan Brown /*
1769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Allocate or resize memory previously allocated for the specified request.
1779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
1789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * The address passed in MUST be considered invalid when this function returns.
179bbf6f00cSJordan Brown  */
180bbf6f00cSJordan Brown void *
smb_srm_realloc(smb_request_t * sr,void * p,size_t size)181bbf6f00cSJordan Brown smb_srm_realloc(smb_request_t *sr, void *p, size_t size)
182bbf6f00cSJordan Brown {
1839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (smb_realloc(sr, p, size, B_FALSE));
1849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
1859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
1879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Allocate or resize memory previously allocated for the specified request. If
1889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * the new size is greater than the current size, the extra space is zeroed out.
1899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * If the new size is less then the current size the space truncated is zeroed
1909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * out.
1919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
1929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * The address passed in MUST be considered invalid when this function returns.
1939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
1949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void *
smb_srm_rezalloc(smb_request_t * sr,void * p,size_t size)1959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_srm_rezalloc(smb_request_t *sr, void *p, size_t size)
1969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
1979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (smb_realloc(sr, p, size, B_TRUE));
1989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
1999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
200148c5f43SAlan Wright char *
smb_srm_strdup(smb_request_t * sr,const char * s)201148c5f43SAlan Wright smb_srm_strdup(smb_request_t *sr, const char *s)
202148c5f43SAlan Wright {
203148c5f43SAlan Wright 	char	*p;
204148c5f43SAlan Wright 	size_t	size;
205148c5f43SAlan Wright 
206148c5f43SAlan Wright 	size = strlen(s) + 1;
207148c5f43SAlan Wright 	p = smb_srm_alloc(sr, size);
208148c5f43SAlan Wright 	bcopy(s, p, size);
209148c5f43SAlan Wright 	return (p);
210148c5f43SAlan Wright }
211148c5f43SAlan Wright 
2129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
2139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Allocate memory.
2149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
2159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * sr	If not NULL, request the memory allocated must be associated with.
2169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
2179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * size	Size of the meory to allocate.
2189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
2199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * zero	If true the memory allocated will be zeroed out.
2209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
2219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void *
smb_alloc(smb_request_t * sr,size_t size,boolean_t zero)2229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_alloc(smb_request_t *sr, size_t size, boolean_t zero)
2239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
2249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_mem_header_t	*smh;
2259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (zero) {
2279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smh = kmem_zalloc(size + sizeof (smb_mem_header_t), KM_SLEEP);
2289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	} else {
2299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smh = kmem_alloc(size + sizeof (smb_mem_header_t), KM_SLEEP);
2309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smh->smh_sr = NULL;
2319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		bzero(&smh->smh_lnd, sizeof (smh->smh_lnd));
2329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
2339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smh->smh_sr = sr;
2349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smh->smh_size = size;
2359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smh->smh_magic = SMB_SMH_MAGIC;
2369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (sr != NULL) {
2379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		SMB_REQ_VALID(sr);
2389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		list_insert_tail(&sr->sr_storage, smh);
2399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
2409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (++smh);
2419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
2429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
2449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Free memory.
2459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
2469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * sr	If not NULL, request the memory to free is associated with.
2479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
2489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * ptr	Memory address
2499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
2509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * zero	If true the memory is zeroed out before being freed.
2519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
2529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void
smb_free(smb_request_t * sr,void * ptr,boolean_t zero)2539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_free(smb_request_t *sr, void *ptr, boolean_t zero)
2549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
2559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_mem_header_t	*smh;
2569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (ptr != NULL) {
2589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smh = SMB_MEM2SMH(ptr);
2599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		SMB_SMH_VALID(smh);
2609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		ASSERT(sr == smh->smh_sr);
2619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (sr != NULL) {
2629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			SMB_REQ_VALID(sr);
2639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			list_remove(&sr->sr_storage, smh);
2649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
2659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (zero)
2669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			bzero(ptr, smh->smh_size);
2679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smh->smh_magic = 0;
2699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		kmem_free(smh, smh->smh_size + sizeof (smb_mem_header_t));
2709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
2719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
2729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
2749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Allocate or resize memory previously allocated.
2759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
2769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * sr	If not NULL, request the memory is associated with.
2779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
2789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * ptr	Memory address
2799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
2809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * size	New size
2819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
2829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * zero	If true zero out the extra space or the truncated space.
2839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
2849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void *
smb_realloc(smb_request_t * sr,void * ptr,size_t size,boolean_t zero)2859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_realloc(smb_request_t *sr, void *ptr, size_t size, boolean_t zero)
2869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
2879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_mem_header_t	*smh;
2889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	void			*new_ptr;
289bbf6f00cSJordan Brown 
2909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (ptr == NULL)
2919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (smb_alloc(sr, size, zero));
292bbf6f00cSJordan Brown 
2939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smh = SMB_MEM2SMH(ptr);
2949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	SMB_SMH_VALID(smh);
2959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(sr == smh->smh_sr);
296bbf6f00cSJordan Brown 
2979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (size == 0) {
2989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smb_free(sr, ptr, zero);
2999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (NULL);
3009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
3019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smh->smh_size >= size) {
302*da90d5b8SJohn Levon 		if ((zero) && (smh->smh_size > size))
3039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			bzero((caddr_t)ptr + size, smh->smh_size - size);
3049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (ptr);
3059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
3069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	new_ptr = smb_alloc(sr, size, B_FALSE);
3079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bcopy(ptr, new_ptr, smh->smh_size);
3089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (zero)
3099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		bzero((caddr_t)new_ptr + smh->smh_size, size - smh->smh_size);
310bbf6f00cSJordan Brown 
3119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_free(sr, ptr, zero);
3129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (new_ptr);
313bbf6f00cSJordan Brown }
314