usr/src/lib/libzpool/common/kernel.c
author ek110237
Thu, 05 Apr 2007 13:22:27 -0700
changeset 3975 6674f5d79069
parent 3912 f6891a60bd72
child 4543 12bb2876a62e
permissions -rw-r--r--
6282725 hostname/hostid should be stored in the label
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     1
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     2
 * CDDL HEADER START
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     3
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
     5
 * Common Development and Distribution License (the "License").
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
     6
 * You may not use this file except in compliance with the License.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     7
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    11
 * and limitations under the License.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    12
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    18
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    19
 * CDDL HEADER END
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    20
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    21
/*
3403
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 2856
diff changeset
    22
 * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    23
 * Use is subject to license terms.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    24
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    25
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    26
#pragma ident	"%Z%%M%	%I%	%E% SMI"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    27
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    28
#include <assert.h>
3886
3291401d66a6 6536602 add zlib compression support and upgrade to version 1.2.3
ahl
parents: 3713
diff changeset
    29
#include <fcntl.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    30
#include <poll.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    31
#include <stdio.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    32
#include <stdlib.h>
3886
3291401d66a6 6536602 add zlib compression support and upgrade to version 1.2.3
ahl
parents: 3713
diff changeset
    33
#include <string.h>
3291401d66a6 6536602 add zlib compression support and upgrade to version 1.2.3
ahl
parents: 3713
diff changeset
    34
#include <zlib.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    35
#include <sys/spa.h>
3886
3291401d66a6 6536602 add zlib compression support and upgrade to version 1.2.3
ahl
parents: 3713
diff changeset
    36
#include <sys/stat.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    37
#include <sys/processor.h>
3886
3291401d66a6 6536602 add zlib compression support and upgrade to version 1.2.3
ahl
parents: 3713
diff changeset
    38
#include <sys/zfs_context.h>
3291401d66a6 6536602 add zlib compression support and upgrade to version 1.2.3
ahl
parents: 3713
diff changeset
    39
#include <sys/zmod.h>
3975
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
    40
#include <sys/utsname.h>
2856
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 1635
diff changeset
    41
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    42
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    43
 * Emulation of kernel services in userland.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    44
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    45
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    46
uint64_t physmem;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    47
vnode_t *rootdir = (vnode_t *)0xabcd1234;
3975
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
    48
char hw_serial[11];
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
    49
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
    50
struct utsname utsname = {
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
    51
	"userland", "libzpool", "1", "1", "na"
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
    52
};
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    53
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    54
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    55
 * =========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    56
 * threads
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    57
 * =========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    58
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    59
/*ARGSUSED*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    60
kthread_t *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    61
zk_thread_create(void (*func)(), void *arg)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    62
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    63
	thread_t tid;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    64
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    65
	VERIFY(thr_create(0, 0, (void *(*)(void *))func, arg, THR_DETACHED,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    66
	    &tid) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    67
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    68
	return ((void *)(uintptr_t)tid);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    69
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    70
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    71
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    72
 * =========================================================================
3403
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 2856
diff changeset
    73
 * kstats
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 2856
diff changeset
    74
 * =========================================================================
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 2856
diff changeset
    75
 */
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 2856
diff changeset
    76
/*ARGSUSED*/
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 2856
diff changeset
    77
kstat_t *
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 2856
diff changeset
    78
kstat_create(char *module, int instance, char *name, char *class,
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 2856
diff changeset
    79
    uchar_t type, ulong_t ndata, uchar_t ks_flag)
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 2856
diff changeset
    80
{
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 2856
diff changeset
    81
	return (NULL);
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 2856
diff changeset
    82
}
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 2856
diff changeset
    83
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 2856
diff changeset
    84
/*ARGSUSED*/
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 2856
diff changeset
    85
void
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 2856
diff changeset
    86
kstat_install(kstat_t *ksp)
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 2856
diff changeset
    87
{}
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 2856
diff changeset
    88
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 2856
diff changeset
    89
/*ARGSUSED*/
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 2856
diff changeset
    90
void
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 2856
diff changeset
    91
kstat_delete(kstat_t *ksp)
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 2856
diff changeset
    92
{}
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 2856
diff changeset
    93
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 2856
diff changeset
    94
/*
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 2856
diff changeset
    95
 * =========================================================================
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    96
 * mutexes
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    97
 * =========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    98
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    99
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   100
zmutex_init(kmutex_t *mp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   101
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   102
	mp->m_owner = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   103
	(void) _mutex_init(&mp->m_lock, USYNC_THREAD, NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   104
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   105
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   106
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   107
zmutex_destroy(kmutex_t *mp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   108
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   109
	ASSERT(mp->m_owner == NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   110
	(void) _mutex_destroy(&(mp)->m_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   111
	mp->m_owner = (void *)-1UL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   112
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   113
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   114
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   115
mutex_enter(kmutex_t *mp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   116
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   117
	ASSERT(mp->m_owner != (void *)-1UL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   118
	ASSERT(mp->m_owner != curthread);
2856
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 1635
diff changeset
   119
	VERIFY(mutex_lock(&mp->m_lock) == 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   120
	ASSERT(mp->m_owner == NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   121
	mp->m_owner = curthread;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   122
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   123
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   124
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   125
mutex_tryenter(kmutex_t *mp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   126
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   127
	ASSERT(mp->m_owner != (void *)-1UL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   128
	if (0 == mutex_trylock(&mp->m_lock)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   129
		ASSERT(mp->m_owner == NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   130
		mp->m_owner = curthread;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   131
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   132
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   133
		return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   134
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   135
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   136
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   137
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   138
mutex_exit(kmutex_t *mp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   139
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   140
	ASSERT(mutex_owner(mp) == curthread);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   141
	mp->m_owner = NULL;
2856
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 1635
diff changeset
   142
	VERIFY(mutex_unlock(&mp->m_lock) == 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   143
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   144
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   145
void *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   146
mutex_owner(kmutex_t *mp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   147
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   148
	return (mp->m_owner);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   149
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   150
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   151
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   152
 * =========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   153
 * rwlocks
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   154
 * =========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   155
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   156
/*ARGSUSED*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   157
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   158
rw_init(krwlock_t *rwlp, char *name, int type, void *arg)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   159
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   160
	rwlock_init(&rwlp->rw_lock, USYNC_THREAD, NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   161
	rwlp->rw_owner = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   162
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   163
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   164
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   165
rw_destroy(krwlock_t *rwlp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   166
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   167
	rwlock_destroy(&rwlp->rw_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   168
	rwlp->rw_owner = (void *)-1UL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   169
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   170
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   171
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   172
rw_enter(krwlock_t *rwlp, krw_t rw)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   173
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   174
	ASSERT(!RW_LOCK_HELD(rwlp));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   175
	ASSERT(rwlp->rw_owner != (void *)-1UL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   176
	ASSERT(rwlp->rw_owner != curthread);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   177
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   178
	if (rw == RW_READER)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   179
		(void) rw_rdlock(&rwlp->rw_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   180
	else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   181
		(void) rw_wrlock(&rwlp->rw_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   182
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   183
	rwlp->rw_owner = curthread;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   184
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   185
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   186
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   187
rw_exit(krwlock_t *rwlp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   188
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   189
	ASSERT(rwlp->rw_owner != (void *)-1UL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   190
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   191
	rwlp->rw_owner = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   192
	(void) rw_unlock(&rwlp->rw_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   193
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   194
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   195
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   196
rw_tryenter(krwlock_t *rwlp, krw_t rw)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   197
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   198
	int rv;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   199
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   200
	ASSERT(rwlp->rw_owner != (void *)-1UL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   201
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   202
	if (rw == RW_READER)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   203
		rv = rw_tryrdlock(&rwlp->rw_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   204
	else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   205
		rv = rw_trywrlock(&rwlp->rw_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   206
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   207
	if (rv == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   208
		rwlp->rw_owner = curthread;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   209
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   210
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   211
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   212
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   213
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   214
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   215
/*ARGSUSED*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   216
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   217
rw_tryupgrade(krwlock_t *rwlp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   218
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   219
	ASSERT(rwlp->rw_owner != (void *)-1UL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   220
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   221
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   222
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   223
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   224
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   225
 * =========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   226
 * condition variables
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   227
 * =========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   228
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   229
/*ARGSUSED*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   230
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   231
cv_init(kcondvar_t *cv, char *name, int type, void *arg)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   232
{
2856
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 1635
diff changeset
   233
	VERIFY(cond_init(cv, type, NULL) == 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   234
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   235
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   236
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   237
cv_destroy(kcondvar_t *cv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   238
{
2856
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 1635
diff changeset
   239
	VERIFY(cond_destroy(cv) == 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   240
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   241
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   242
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   243
cv_wait(kcondvar_t *cv, kmutex_t *mp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   244
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   245
	ASSERT(mutex_owner(mp) == curthread);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   246
	mp->m_owner = NULL;
2856
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 1635
diff changeset
   247
	int ret = cond_wait(cv, &mp->m_lock);
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 1635
diff changeset
   248
	VERIFY(ret == 0 || ret == EINTR);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   249
	mp->m_owner = curthread;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   250
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   251
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   252
clock_t
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   253
cv_timedwait(kcondvar_t *cv, kmutex_t *mp, clock_t abstime)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   254
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   255
	int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   256
	timestruc_t ts;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   257
	clock_t delta;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   258
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   259
top:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   260
	delta = abstime - lbolt;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   261
	if (delta <= 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   262
		return (-1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   263
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   264
	ts.tv_sec = delta / hz;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   265
	ts.tv_nsec = (delta % hz) * (NANOSEC / hz);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   266
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   267
	ASSERT(mutex_owner(mp) == curthread);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   268
	mp->m_owner = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   269
	error = cond_reltimedwait(cv, &mp->m_lock, &ts);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   270
	mp->m_owner = curthread;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   271
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   272
	if (error == ETIME)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   273
		return (-1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   274
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   275
	if (error == EINTR)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   276
		goto top;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   277
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   278
	ASSERT(error == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   279
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   280
	return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   281
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   282
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   283
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   284
cv_signal(kcondvar_t *cv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   285
{
2856
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 1635
diff changeset
   286
	VERIFY(cond_signal(cv) == 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   287
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   288
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   289
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   290
cv_broadcast(kcondvar_t *cv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   291
{
2856
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 1635
diff changeset
   292
	VERIFY(cond_broadcast(cv) == 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   293
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   294
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   295
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   296
 * =========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   297
 * vnode operations
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   298
 * =========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   299
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   300
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   301
 * Note: for the xxxat() versions of these functions, we assume that the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   302
 * starting vp is always rootdir (which is true for spa_directory.c, the only
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   303
 * ZFS consumer of these interfaces).  We assert this is true, and then emulate
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   304
 * them by adding '/' in front of the path.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   305
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   306
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   307
/*ARGSUSED*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   308
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   309
vn_open(char *path, int x1, int flags, int mode, vnode_t **vpp, int x2, int x3)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   310
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   311
	int fd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   312
	vnode_t *vp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   313
	int old_umask;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   314
	char realpath[MAXPATHLEN];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   315
	struct stat64 st;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   316
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   317
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   318
	 * If we're accessing a real disk from userland, we need to use
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   319
	 * the character interface to avoid caching.  This is particularly
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   320
	 * important if we're trying to look at a real in-kernel storage
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   321
	 * pool from userland, e.g. via zdb, because otherwise we won't
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   322
	 * see the changes occurring under the segmap cache.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   323
	 * On the other hand, the stupid character device returns zero
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   324
	 * for its size.  So -- gag -- we open the block device to get
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   325
	 * its size, and remember it for subsequent VOP_GETATTR().
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   326
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   327
	if (strncmp(path, "/dev/", 5) == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   328
		char *dsk;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   329
		fd = open64(path, O_RDONLY);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   330
		if (fd == -1)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   331
			return (errno);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   332
		if (fstat64(fd, &st) == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   333
			close(fd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   334
			return (errno);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   335
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   336
		close(fd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   337
		(void) sprintf(realpath, "%s", path);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   338
		dsk = strstr(path, "/dsk/");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   339
		if (dsk != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   340
			(void) sprintf(realpath + (dsk - path) + 1, "r%s",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   341
			    dsk + 1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   342
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   343
		(void) sprintf(realpath, "%s", path);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   344
		if (!(flags & FCREAT) && stat64(realpath, &st) == -1)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   345
			return (errno);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   346
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   347
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   348
	if (flags & FCREAT)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   349
		old_umask = umask(0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   350
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   351
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   352
	 * The construct 'flags - FREAD' conveniently maps combinations of
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   353
	 * FREAD and FWRITE to the corresponding O_RDONLY, O_WRONLY, and O_RDWR.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   354
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   355
	fd = open64(realpath, flags - FREAD, mode);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   356
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   357
	if (flags & FCREAT)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   358
		(void) umask(old_umask);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   359
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   360
	if (fd == -1)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   361
		return (errno);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   362
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   363
	if (fstat64(fd, &st) == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   364
		close(fd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   365
		return (errno);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   366
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   367
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   368
	(void) fcntl(fd, F_SETFD, FD_CLOEXEC);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   369
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   370
	*vpp = vp = umem_zalloc(sizeof (vnode_t), UMEM_NOFAIL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   371
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   372
	vp->v_fd = fd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   373
	vp->v_size = st.st_size;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   374
	vp->v_path = spa_strdup(path);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   375
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   376
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   377
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   378
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   379
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   380
vn_openat(char *path, int x1, int flags, int mode, vnode_t **vpp, int x2,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   381
    int x3, vnode_t *startvp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   382
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   383
	char *realpath = umem_alloc(strlen(path) + 2, UMEM_NOFAIL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   384
	int ret;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   385
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   386
	ASSERT(startvp == rootdir);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   387
	(void) sprintf(realpath, "/%s", path);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   388
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   389
	ret = vn_open(realpath, x1, flags, mode, vpp, x2, x3);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   390
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   391
	umem_free(realpath, strlen(path) + 2);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   392
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   393
	return (ret);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   394
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   395
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   396
/*ARGSUSED*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   397
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   398
vn_rdwr(int uio, vnode_t *vp, void *addr, ssize_t len, offset_t offset,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   399
	int x1, int x2, rlim64_t x3, void *x4, ssize_t *residp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   400
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   401
	ssize_t iolen, split;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   402
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   403
	if (uio == UIO_READ) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   404
		iolen = pread64(vp->v_fd, addr, len, offset);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   405
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   406
		/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   407
		 * To simulate partial disk writes, we split writes into two
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   408
		 * system calls so that the process can be killed in between.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   409
		 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   410
		split = (len > 0 ? rand() % len : 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   411
		iolen = pwrite64(vp->v_fd, addr, split, offset);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   412
		iolen += pwrite64(vp->v_fd, (char *)addr + split,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   413
		    len - split, offset + split);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   414
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   415
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   416
	if (iolen == -1)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   417
		return (errno);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   418
	if (residp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   419
		*residp = len - iolen;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   420
	else if (iolen != len)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   421
		return (EIO);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   422
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   423
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   424
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   425
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   426
vn_close(vnode_t *vp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   427
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   428
	close(vp->v_fd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   429
	spa_strfree(vp->v_path);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   430
	umem_free(vp, sizeof (vnode_t));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   431
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   432
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   433
#ifdef ZFS_DEBUG
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   434
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   435
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   436
 * =========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   437
 * Figure out which debugging statements to print
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   438
 * =========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   439
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   440
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   441
static char *dprintf_string;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   442
static int dprintf_print_all;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   443
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   444
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   445
dprintf_find_string(const char *string)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   446
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   447
	char *tmp_str = dprintf_string;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   448
	int len = strlen(string);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   449
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   450
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   451
	 * Find out if this is a string we want to print.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   452
	 * String format: file1.c,function_name1,file2.c,file3.c
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   453
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   454
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   455
	while (tmp_str != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   456
		if (strncmp(tmp_str, string, len) == 0 &&
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   457
		    (tmp_str[len] == ',' || tmp_str[len] == '\0'))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   458
			return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   459
		tmp_str = strchr(tmp_str, ',');
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   460
		if (tmp_str != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   461
			tmp_str++; /* Get rid of , */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   462
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   463
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   464
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   465
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   466
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   467
dprintf_setup(int *argc, char **argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   468
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   469
	int i, j;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   470
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   471
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   472
	 * Debugging can be specified two ways: by setting the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   473
	 * environment variable ZFS_DEBUG, or by including a
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   474
	 * "debug=..."  argument on the command line.  The command
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   475
	 * line setting overrides the environment variable.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   476
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   477
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   478
	for (i = 1; i < *argc; i++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   479
		int len = strlen("debug=");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   480
		/* First look for a command line argument */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   481
		if (strncmp("debug=", argv[i], len) == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   482
			dprintf_string = argv[i] + len;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   483
			/* Remove from args */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   484
			for (j = i; j < *argc; j++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   485
				argv[j] = argv[j+1];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   486
			argv[j] = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   487
			(*argc)--;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   488
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   489
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   490
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   491
	if (dprintf_string == NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   492
		/* Look for ZFS_DEBUG environment variable */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   493
		dprintf_string = getenv("ZFS_DEBUG");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   494
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   495
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   496
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   497
	 * Are we just turning on all debugging?
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   498
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   499
	if (dprintf_find_string("on"))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   500
		dprintf_print_all = 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   501
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   502
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   503
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   504
 * =========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   505
 * debug printfs
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   506
 * =========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   507
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   508
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   509
__dprintf(const char *file, const char *func, int line, const char *fmt, ...)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   510
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   511
	const char *newfile;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   512
	va_list adx;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   513
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   514
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   515
	 * Get rid of annoying "../common/" prefix to filename.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   516
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   517
	newfile = strrchr(file, '/');
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   518
	if (newfile != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   519
		newfile = newfile + 1; /* Get rid of leading / */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   520
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   521
		newfile = file;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   522
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   523
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   524
	if (dprintf_print_all ||
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   525
	    dprintf_find_string(newfile) ||
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   526
	    dprintf_find_string(func)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   527
		/* Print out just the function name if requested */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   528
		flockfile(stdout);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   529
		if (dprintf_find_string("pid"))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   530
			(void) printf("%d ", getpid());
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   531
		if (dprintf_find_string("tid"))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   532
			(void) printf("%u ", thr_self());
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   533
		if (dprintf_find_string("cpu"))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   534
			(void) printf("%u ", getcpuid());
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   535
		if (dprintf_find_string("time"))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   536
			(void) printf("%llu ", gethrtime());
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   537
		if (dprintf_find_string("long"))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   538
			(void) printf("%s, line %d: ", newfile, line);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   539
		(void) printf("%s: ", func);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   540
		va_start(adx, fmt);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   541
		(void) vprintf(fmt, adx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   542
		va_end(adx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   543
		funlockfile(stdout);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   544
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   545
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   546
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   547
#endif /* ZFS_DEBUG */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   548
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   549
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   550
 * =========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   551
 * cmn_err() and panic()
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   552
 * =========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   553
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   554
static char ce_prefix[CE_IGNORE][10] = { "", "NOTICE: ", "WARNING: ", "" };
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   555
static char ce_suffix[CE_IGNORE][2] = { "", "\n", "\n", "" };
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   556
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   557
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   558
vpanic(const char *fmt, va_list adx)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   559
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   560
	(void) fprintf(stderr, "error: ");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   561
	(void) vfprintf(stderr, fmt, adx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   562
	(void) fprintf(stderr, "\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   563
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   564
	abort();	/* think of it as a "user-level crash dump" */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   565
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   566
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   567
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   568
panic(const char *fmt, ...)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   569
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   570
	va_list adx;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   571
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   572
	va_start(adx, fmt);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   573
	vpanic(fmt, adx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   574
	va_end(adx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   575
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   576
3713
00e75dc8b749 6527325 want more assertions in space map code
ahrens
parents: 3403
diff changeset
   577
void
00e75dc8b749 6527325 want more assertions in space map code
ahrens
parents: 3403
diff changeset
   578
vcmn_err(int ce, const char *fmt, va_list adx)
00e75dc8b749 6527325 want more assertions in space map code
ahrens
parents: 3403
diff changeset
   579
{
00e75dc8b749 6527325 want more assertions in space map code
ahrens
parents: 3403
diff changeset
   580
	if (ce == CE_PANIC)
00e75dc8b749 6527325 want more assertions in space map code
ahrens
parents: 3403
diff changeset
   581
		vpanic(fmt, adx);
00e75dc8b749 6527325 want more assertions in space map code
ahrens
parents: 3403
diff changeset
   582
	if (ce != CE_NOTE) {	/* suppress noise in userland stress testing */
00e75dc8b749 6527325 want more assertions in space map code
ahrens
parents: 3403
diff changeset
   583
		(void) fprintf(stderr, "%s", ce_prefix[ce]);
00e75dc8b749 6527325 want more assertions in space map code
ahrens
parents: 3403
diff changeset
   584
		(void) vfprintf(stderr, fmt, adx);
00e75dc8b749 6527325 want more assertions in space map code
ahrens
parents: 3403
diff changeset
   585
		(void) fprintf(stderr, "%s", ce_suffix[ce]);
00e75dc8b749 6527325 want more assertions in space map code
ahrens
parents: 3403
diff changeset
   586
	}
00e75dc8b749 6527325 want more assertions in space map code
ahrens
parents: 3403
diff changeset
   587
}
00e75dc8b749 6527325 want more assertions in space map code
ahrens
parents: 3403
diff changeset
   588
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   589
/*PRINTFLIKE2*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   590
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   591
cmn_err(int ce, const char *fmt, ...)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   592
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   593
	va_list adx;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   594
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   595
	va_start(adx, fmt);
3713
00e75dc8b749 6527325 want more assertions in space map code
ahrens
parents: 3403
diff changeset
   596
	vcmn_err(ce, fmt, adx);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   597
	va_end(adx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   598
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   599
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   600
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   601
 * =========================================================================
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   602
 * kobj interfaces
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   603
 * =========================================================================
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   604
 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   605
struct _buf *
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   606
kobj_open_file(char *name)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   607
{
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   608
	struct _buf *file;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   609
	vnode_t *vp;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   610
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   611
	/* set vp as the _fd field of the file */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   612
	if (vn_openat(name, UIO_SYSSPACE, FREAD, 0, &vp, 0, 0, rootdir) != 0)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   613
		return ((void *)-1UL);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   614
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   615
	file = umem_zalloc(sizeof (struct _buf), UMEM_NOFAIL);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   616
	file->_fd = (intptr_t)vp;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   617
	return (file);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   618
}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   619
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   620
int
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   621
kobj_read_file(struct _buf *file, char *buf, unsigned size, unsigned off)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   622
{
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   623
	ssize_t resid;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   624
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   625
	vn_rdwr(UIO_READ, (vnode_t *)file->_fd, buf, size, (offset_t)off,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   626
	    UIO_SYSSPACE, 0, 0, 0, &resid);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   627
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   628
	return (size - resid);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   629
}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   630
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   631
void
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   632
kobj_close_file(struct _buf *file)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   633
{
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   634
	vn_close((vnode_t *)file->_fd);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   635
	umem_free(file, sizeof (struct _buf));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   636
}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   637
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   638
int
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   639
kobj_get_filesize(struct _buf *file, uint64_t *size)
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   640
{
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   641
	struct stat64 st;
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   642
	vnode_t *vp = (vnode_t *)file->_fd;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   643
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   644
	if (fstat64(vp->v_fd, &st) == -1) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   645
		vn_close(vp);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   646
		return (errno);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   647
	}
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   648
	*size = st.st_size;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   649
	return (0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   650
}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   651
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   652
/*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
   653
 * =========================================================================
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   654
 * misc routines
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   655
 * =========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   656
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   657
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   658
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   659
delay(clock_t ticks)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   660
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   661
	poll(0, 0, ticks * (1000 / hz));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   662
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   663
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   664
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   665
 * Find highest one bit set.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   666
 *	Returns bit number + 1 of highest bit that is set, otherwise returns 0.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   667
 * High order bit is 31 (or 63 in _LP64 kernel).
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   668
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   669
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   670
highbit(ulong_t i)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   671
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   672
	register int h = 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   673
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   674
	if (i == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   675
		return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   676
#ifdef _LP64
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   677
	if (i & 0xffffffff00000000ul) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   678
		h += 32; i >>= 32;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   679
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   680
#endif
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   681
	if (i & 0xffff0000) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   682
		h += 16; i >>= 16;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   683
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   684
	if (i & 0xff00) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   685
		h += 8; i >>= 8;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   686
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   687
	if (i & 0xf0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   688
		h += 4; i >>= 4;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   689
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   690
	if (i & 0xc) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   691
		h += 2; i >>= 2;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   692
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   693
	if (i & 0x2) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   694
		h += 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   695
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   696
	return (h);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   697
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   698
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   699
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   700
random_get_bytes_common(uint8_t *ptr, size_t len, char *devname)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   701
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   702
	int fd = open(devname, O_RDONLY);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   703
	size_t resid = len;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   704
	ssize_t bytes;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   705
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   706
	ASSERT(fd != -1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   707
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   708
	while (resid != 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   709
		bytes = read(fd, ptr, resid);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   710
		ASSERT(bytes >= 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   711
		ptr += bytes;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   712
		resid -= bytes;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   713
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   714
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   715
	close(fd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   716
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   717
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   718
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   719
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   720
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   721
random_get_bytes(uint8_t *ptr, size_t len)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   722
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   723
	return (random_get_bytes_common(ptr, len, "/dev/random"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   724
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   725
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   726
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   727
random_get_pseudo_bytes(uint8_t *ptr, size_t len)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   728
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   729
	return (random_get_bytes_common(ptr, len, "/dev/urandom"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   730
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   731
3975
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
   732
int
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
   733
ddi_strtoul(const char *hw_serial, char **nptr, int base, unsigned long *result)
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
   734
{
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
   735
	char *end;
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
   736
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
   737
	*result = strtoul(hw_serial, &end, base);
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
   738
	if (*result == 0)
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
   739
		return (errno);
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
   740
	return (0);
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
   741
}
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
   742
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   743
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   744
 * =========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   745
 * kernel emulation setup & teardown
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   746
 * =========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   747
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   748
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   749
umem_out_of_memory(void)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   750
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   751
	char errmsg[] = "out of memory -- generating core dump\n";
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   752
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   753
	write(fileno(stderr), errmsg, sizeof (errmsg));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   754
	abort();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   755
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   756
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   757
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   758
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   759
kernel_init(int mode)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   760
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   761
	umem_nofail_callback(umem_out_of_memory);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   762
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   763
	physmem = sysconf(_SC_PHYS_PAGES);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   764
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   765
	dprintf("physmem = %llu pages (%.2f GB)\n", physmem,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   766
	    (double)physmem * sysconf(_SC_PAGE_SIZE) / (1ULL << 30));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   767
3975
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
   768
	snprintf(hw_serial, sizeof (hw_serial), "%ld", gethostid());
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
   769
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   770
	spa_init(mode);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   771
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   772
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   773
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   774
kernel_fini(void)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   775
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   776
	spa_fini();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   777
}
3886
3291401d66a6 6536602 add zlib compression support and upgrade to version 1.2.3
ahl
parents: 3713
diff changeset
   778
3291401d66a6 6536602 add zlib compression support and upgrade to version 1.2.3
ahl
parents: 3713
diff changeset
   779
int
3291401d66a6 6536602 add zlib compression support and upgrade to version 1.2.3
ahl
parents: 3713
diff changeset
   780
z_uncompress(void *dst, size_t *dstlen, const void *src, size_t srclen)
3291401d66a6 6536602 add zlib compression support and upgrade to version 1.2.3
ahl
parents: 3713
diff changeset
   781
{
3291401d66a6 6536602 add zlib compression support and upgrade to version 1.2.3
ahl
parents: 3713
diff changeset
   782
	int ret;
3291401d66a6 6536602 add zlib compression support and upgrade to version 1.2.3
ahl
parents: 3713
diff changeset
   783
	uLongf len = *dstlen;
3291401d66a6 6536602 add zlib compression support and upgrade to version 1.2.3
ahl
parents: 3713
diff changeset
   784
3291401d66a6 6536602 add zlib compression support and upgrade to version 1.2.3
ahl
parents: 3713
diff changeset
   785
	if ((ret = uncompress(dst, &len, src, srclen)) == Z_OK)
3291401d66a6 6536602 add zlib compression support and upgrade to version 1.2.3
ahl
parents: 3713
diff changeset
   786
		*dstlen = (size_t)len;
3291401d66a6 6536602 add zlib compression support and upgrade to version 1.2.3
ahl
parents: 3713
diff changeset
   787
3291401d66a6 6536602 add zlib compression support and upgrade to version 1.2.3
ahl
parents: 3713
diff changeset
   788
	return (ret);
3291401d66a6 6536602 add zlib compression support and upgrade to version 1.2.3
ahl
parents: 3713
diff changeset
   789
}
3291401d66a6 6536602 add zlib compression support and upgrade to version 1.2.3
ahl
parents: 3713
diff changeset
   790
3291401d66a6 6536602 add zlib compression support and upgrade to version 1.2.3
ahl
parents: 3713
diff changeset
   791
int
3291401d66a6 6536602 add zlib compression support and upgrade to version 1.2.3
ahl
parents: 3713
diff changeset
   792
z_compress_level(void *dst, size_t *dstlen, const void *src, size_t srclen,
3291401d66a6 6536602 add zlib compression support and upgrade to version 1.2.3
ahl
parents: 3713
diff changeset
   793
    int level)
3291401d66a6 6536602 add zlib compression support and upgrade to version 1.2.3
ahl
parents: 3713
diff changeset
   794
{
3291401d66a6 6536602 add zlib compression support and upgrade to version 1.2.3
ahl
parents: 3713
diff changeset
   795
	int ret;
3291401d66a6 6536602 add zlib compression support and upgrade to version 1.2.3
ahl
parents: 3713
diff changeset
   796
	uLongf len = *dstlen;
3291401d66a6 6536602 add zlib compression support and upgrade to version 1.2.3
ahl
parents: 3713
diff changeset
   797
3291401d66a6 6536602 add zlib compression support and upgrade to version 1.2.3
ahl
parents: 3713
diff changeset
   798
	if ((ret = compress2(dst, &len, src, srclen, level)) == Z_OK)
3291401d66a6 6536602 add zlib compression support and upgrade to version 1.2.3
ahl
parents: 3713
diff changeset
   799
		*dstlen = (size_t)len;
3291401d66a6 6536602 add zlib compression support and upgrade to version 1.2.3
ahl
parents: 3713
diff changeset
   800
3291401d66a6 6536602 add zlib compression support and upgrade to version 1.2.3
ahl
parents: 3713
diff changeset
   801
	return (ret);
3291401d66a6 6536602 add zlib compression support and upgrade to version 1.2.3
ahl
parents: 3713
diff changeset
   802
}