xref: /titanic_52/usr/src/uts/common/fs/smbsrv/smb_alloc.c (revision 148c5f43199ca0b43fc8e3b643aab11cd66ea327)
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 /*
22*148c5f43SAlan Wright  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
23da6c28aaSamw  */
24da6c28aaSamw 
25da6c28aaSamw #include <sys/types.h>
26da6c28aaSamw #include <sys/sunddi.h>
27da6c28aaSamw #include <sys/kmem.h>
28da6c28aaSamw #include <sys/sysmacros.h>
29bbf6f00cSJordan Brown #include <smbsrv/smb_kproto.h>
30da6c28aaSamw #include <smbsrv/alloc.h>
31da6c28aaSamw 
329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define	SMB_SMH_MAGIC		0x534D485F	/* 'SMH_' */
339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define	SMB_SMH_VALID(_smh_)	ASSERT((_smh_)->smh_magic == SMB_SMH_MAGIC)
349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define	SMB_MEM2SMH(_mem_)	((smb_mem_header_t *)(_mem_) - 1)
35da6c28aaSamw 
369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States typedef struct smb_mem_header {
379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t	smh_magic;
389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	size_t		smh_size;
399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_request_t	*smh_sr;
409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_node_t	smh_lnd;
419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } smb_mem_header_t;
429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void *smb_alloc(smb_request_t *, size_t, boolean_t);
449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void smb_free(smb_request_t *, void *, boolean_t);
459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void *smb_realloc(smb_request_t *, void *, size_t, boolean_t);
469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Allocate memory.
499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
50da6c28aaSamw void *
519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_mem_alloc(size_t size)
52da6c28aaSamw {
539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (smb_alloc(NULL, size, B_FALSE));
54da6c28aaSamw }
55da6c28aaSamw 
569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Allocate memory and zero it out.
589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void *
609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_mem_zalloc(size_t size)
619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (smb_alloc(NULL, size, B_TRUE));
639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Allocate or resize memory previously allocated.
679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * The address passed in MUST be considered invalid when this function returns.
699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void *
719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_mem_realloc(void *ptr, size_t size)
729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (smb_realloc(NULL, ptr, size, B_FALSE));
749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Allocate or resize memory previously allocated. If the new size is greater
789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * than the current size, the extra space is zeroed out. If the new size is less
799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * then the current size the space truncated is zeroed out.
809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * The address passed in MUST be considered invalid when this function returns.
829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void *
849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_mem_rezalloc(void *ptr, size_t size)
859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (smb_realloc(NULL, ptr, size, B_TRUE));
879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Free memory previously allocated with smb_malloc(), smb_zalloc(),
919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_remalloc() or smb_rezalloc().
929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_mem_free(void *ptr)
959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_free(NULL, ptr, B_FALSE);
979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
1009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Free memory previously allocated with smb_mem_malloc(), smb_mem_zalloc(),
1019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_mem_remalloc() or smb_mem_rezalloc() or smb_mem_strdup(). The memory will
1029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * be zeroed out before being actually freed.
1039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
1049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
1059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_mem_zfree(void *ptr)
1069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
1079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_free(NULL, ptr, B_TRUE);
1089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
1099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
1119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Duplicate a string.
1129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
113da6c28aaSamw char *
1149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_mem_strdup(const char *ptr)
115da6c28aaSamw {
116da6c28aaSamw 	char	*p;
117da6c28aaSamw 	size_t	size;
118da6c28aaSamw 
119da6c28aaSamw 	size = strlen(ptr) + 1;
1209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	p = smb_alloc(NULL, size, B_FALSE);
1219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bcopy(ptr, p, size);
122da6c28aaSamw 	return (p);
123da6c28aaSamw }
124da6c28aaSamw 
125bbf6f00cSJordan Brown /*
126bbf6f00cSJordan Brown  * Initialize the list for request-specific temporary storage.
127bbf6f00cSJordan Brown  */
128bbf6f00cSJordan Brown void
129bbf6f00cSJordan Brown smb_srm_init(smb_request_t *sr)
130bbf6f00cSJordan Brown {
1319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_create(&sr->sr_storage, sizeof (smb_mem_header_t),
1329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    offsetof(smb_mem_header_t, smh_lnd));
133bbf6f00cSJordan Brown }
134bbf6f00cSJordan Brown 
135bbf6f00cSJordan Brown /*
1369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Free everything on the request-specific temporary storage list and destroy
1379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * the list.
138bbf6f00cSJordan Brown  */
139bbf6f00cSJordan Brown void
140bbf6f00cSJordan Brown smb_srm_fini(smb_request_t *sr)
141bbf6f00cSJordan Brown {
1429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_mem_header_t	*smh;
143bbf6f00cSJordan Brown 
1449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	while ((smh = list_head(&sr->sr_storage)) != NULL)
1459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smb_free(sr, ++smh, B_FALSE);
146bbf6f00cSJordan Brown 	list_destroy(&sr->sr_storage);
147bbf6f00cSJordan Brown }
148bbf6f00cSJordan Brown 
149bbf6f00cSJordan Brown /*
150bbf6f00cSJordan Brown  * Allocate memory and associate it with the specified request.
1519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Memory allocated here can only be used for the duration of this request; it
1529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * will be freed automatically on completion of the request.
153bbf6f00cSJordan Brown  */
154bbf6f00cSJordan Brown void *
155bbf6f00cSJordan Brown smb_srm_alloc(smb_request_t *sr, size_t size)
156bbf6f00cSJordan Brown {
1579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (smb_alloc(sr, size, B_FALSE));
158bbf6f00cSJordan Brown }
159bbf6f00cSJordan Brown 
160bbf6f00cSJordan Brown /*
1619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Allocate memory, zero it out and associate it with the specified request.
1629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Memory allocated here can only be used for the duration of this request; it
1639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * will be freed automatically on completion of the request.
1649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
1659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void *
1669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_srm_zalloc(smb_request_t *sr, size_t size)
1679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
1689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (smb_alloc(sr, size, B_TRUE));
1699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
1709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
1729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Allocate or resize memory previously allocated for the specified request.
1739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
1749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * The address passed in MUST be considered invalid when this function returns.
175bbf6f00cSJordan Brown  */
176bbf6f00cSJordan Brown void *
177bbf6f00cSJordan Brown smb_srm_realloc(smb_request_t *sr, void *p, size_t size)
178bbf6f00cSJordan Brown {
1799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (smb_realloc(sr, p, size, B_FALSE));
1809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
181bbf6f00cSJordan Brown 
182bbf6f00cSJordan Brown /*
1839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Allocate or resize memory previously allocated for the specified request. If
1849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * the new size is greater than the current size, the extra space is zeroed out.
1859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * If the new size is less then the current size the space truncated is zeroed
1869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * out.
1879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
1889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * The address passed in MUST be considered invalid when this function returns.
189bbf6f00cSJordan Brown  */
1909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void *
1919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_srm_rezalloc(smb_request_t *sr, void *p, size_t size)
1929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
1939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (smb_realloc(sr, p, size, B_TRUE));
1949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
1959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
196*148c5f43SAlan Wright char *
197*148c5f43SAlan Wright smb_srm_strdup(smb_request_t *sr, const char *s)
198*148c5f43SAlan Wright {
199*148c5f43SAlan Wright 	char	*p;
200*148c5f43SAlan Wright 	size_t	size;
201*148c5f43SAlan Wright 
202*148c5f43SAlan Wright 	size = strlen(s) + 1;
203*148c5f43SAlan Wright 	p = smb_srm_alloc(sr, size);
204*148c5f43SAlan Wright 	bcopy(s, p, size);
205*148c5f43SAlan Wright 	return (p);
206*148c5f43SAlan Wright }
207*148c5f43SAlan Wright 
2089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
2099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Allocate memory.
2109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
2119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * sr	If not NULL, request the memory allocated must be associated with.
2129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
2139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * size	Size of the meory to allocate.
2149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
2159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * zero	If true the memory allocated will be zeroed out.
2169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
2179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void *
2189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_alloc(smb_request_t *sr, size_t size, boolean_t zero)
2199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
2209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_mem_header_t	*smh;
2219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (zero) {
2239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smh = kmem_zalloc(size + sizeof (smb_mem_header_t), KM_SLEEP);
2249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	} else {
2259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smh = kmem_alloc(size + sizeof (smb_mem_header_t), KM_SLEEP);
2269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smh->smh_sr = NULL;
2279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		bzero(&smh->smh_lnd, sizeof (smh->smh_lnd));
2289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
2299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smh->smh_sr = sr;
2309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smh->smh_size = size;
2319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smh->smh_magic = SMB_SMH_MAGIC;
2329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (sr != NULL) {
2339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		SMB_REQ_VALID(sr);
2349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		list_insert_tail(&sr->sr_storage, smh);
2359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
2369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (++smh);
2379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
2389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
2409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Free memory.
2419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
2429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * sr	If not NULL, request the memory to free is associated with.
2439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
2449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * ptr	Memory address
2459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
2469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * zero	If true the memory is zeroed out before being freed.
2479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
2489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void
2499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_free(smb_request_t *sr, void *ptr, boolean_t zero)
2509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
2519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_mem_header_t	*smh;
2529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (ptr != NULL) {
2549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smh = SMB_MEM2SMH(ptr);
2559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		SMB_SMH_VALID(smh);
2569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		ASSERT(sr == smh->smh_sr);
2579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (sr != NULL) {
2589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			SMB_REQ_VALID(sr);
2599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			list_remove(&sr->sr_storage, smh);
2609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
2619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (zero)
2629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			bzero(ptr, smh->smh_size);
2639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smh->smh_magic = 0;
2659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		kmem_free(smh, smh->smh_size + sizeof (smb_mem_header_t));
2669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
2679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
2689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
2709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Allocate or resize memory previously allocated.
2719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
2729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * sr	If not NULL, request the memory is associated with.
2739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
2749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * ptr	Memory address
2759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
2769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * size	New size
2779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
2789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * zero	If true zero out the extra space or the truncated space.
2799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
2809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void *
2819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_realloc(smb_request_t *sr, void *ptr, size_t size, boolean_t zero)
2829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
2839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_mem_header_t	*smh;
2849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	void			*new_ptr;
2859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (ptr == NULL)
2879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (smb_alloc(sr, size, zero));
2889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smh = SMB_MEM2SMH(ptr);
2909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	SMB_SMH_VALID(smh);
2919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ASSERT(sr == smh->smh_sr);
2929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (size == 0) {
2949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smb_free(sr, ptr, zero);
2959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (NULL);
2969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
2979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smh->smh_size >= size) {
2989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if ((zero) & (smh->smh_size > size))
2999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			bzero((caddr_t)ptr + size, smh->smh_size - size);
3009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (ptr);
3019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
3029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	new_ptr = smb_alloc(sr, size, B_FALSE);
3039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bcopy(ptr, new_ptr, smh->smh_size);
3049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (zero)
3059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		bzero((caddr_t)new_ptr + smh->smh_size, size - smh->smh_size);
3069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_free(sr, ptr, zero);
3089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (new_ptr);
309bbf6f00cSJordan Brown }
310