Print this page
8115 parallel zfs mount

*** 20,29 **** --- 20,30 ---- */ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, 2015 by Delphix. All rights reserved. * Copyright (c) 2013, Joyent, Inc. All rights reserved. + * Copyright 2017 RackTop Systems. */ #include <assert.h> #include <fcntl.h> #include <poll.h>
*** 39,54 **** #include <sys/rrwlock.h> #include <sys/zmod.h> #include <sys/utsname.h> #include <sys/systeminfo.h> /* * Emulation of kernel services in userland. */ ! int aok; ! uint64_t physmem; vnode_t *rootdir = (vnode_t *)0xabcd1234; char hw_serial[HW_HOSTID_LEN]; kmutex_t cpu_lock; vmem_t *zio_arena = NULL; --- 40,57 ---- #include <sys/rrwlock.h> #include <sys/zmod.h> #include <sys/utsname.h> #include <sys/systeminfo.h> + extern void system_taskq_init(void); + extern void system_taskq_fini(void); + /* * Emulation of kernel services in userland. */ ! pgcnt_t physmem; vnode_t *rootdir = (vnode_t *)0xabcd1234; char hw_serial[HW_HOSTID_LEN]; kmutex_t cpu_lock; vmem_t *zio_arena = NULL;
*** 57,399 **** struct utsname utsname = { "userland", "libzpool", "1", "1", "na" }; - /* this only exists to have its address taken */ - struct proc p0; - /* * ========================================================================= - * threads - * ========================================================================= - */ - /*ARGSUSED*/ - kthread_t * - zk_thread_create(void (*func)(), void *arg, uint64_t len) - { - thread_t tid; - - ASSERT0(len); - VERIFY(thr_create(0, 0, (void *(*)(void *))func, arg, THR_DETACHED, - &tid) == 0); - - return ((void *)(uintptr_t)tid); - } - - /* - * ========================================================================= - * kstats - * ========================================================================= - */ - /*ARGSUSED*/ - kstat_t * - kstat_create(const char *module, int instance, const char *name, - const char *class, uchar_t type, ulong_t ndata, uchar_t ks_flag) - { - return (NULL); - } - - /*ARGSUSED*/ - void - kstat_named_init(kstat_named_t *knp, const char *name, uchar_t type) - {} - - /*ARGSUSED*/ - void - kstat_install(kstat_t *ksp) - {} - - /*ARGSUSED*/ - void - kstat_delete(kstat_t *ksp) - {} - - /*ARGSUSED*/ - void - kstat_waitq_enter(kstat_io_t *kiop) - {} - - /*ARGSUSED*/ - void - kstat_waitq_exit(kstat_io_t *kiop) - {} - - /*ARGSUSED*/ - void - kstat_runq_enter(kstat_io_t *kiop) - {} - - /*ARGSUSED*/ - void - kstat_runq_exit(kstat_io_t *kiop) - {} - - /*ARGSUSED*/ - void - kstat_waitq_to_runq(kstat_io_t *kiop) - {} - - /*ARGSUSED*/ - void - kstat_runq_back_to_waitq(kstat_io_t *kiop) - {} - - /* - * ========================================================================= - * mutexes - * ========================================================================= - */ - void - zmutex_init(kmutex_t *mp) - { - mp->m_owner = NULL; - mp->initialized = B_TRUE; - (void) _mutex_init(&mp->m_lock, USYNC_THREAD, NULL); - } - - void - zmutex_destroy(kmutex_t *mp) - { - ASSERT(mp->initialized == B_TRUE); - ASSERT(mp->m_owner == NULL); - (void) _mutex_destroy(&(mp)->m_lock); - mp->m_owner = (void *)-1UL; - mp->initialized = B_FALSE; - } - - void - zmutex_enter(kmutex_t *mp) - { - ASSERT(mp->initialized == B_TRUE); - ASSERT(mp->m_owner != (void *)-1UL); - ASSERT(mp->m_owner != curthread); - VERIFY(mutex_lock(&mp->m_lock) == 0); - ASSERT(mp->m_owner == NULL); - mp->m_owner = curthread; - } - - int - mutex_tryenter(kmutex_t *mp) - { - ASSERT(mp->initialized == B_TRUE); - ASSERT(mp->m_owner != (void *)-1UL); - if (0 == mutex_trylock(&mp->m_lock)) { - ASSERT(mp->m_owner == NULL); - mp->m_owner = curthread; - return (1); - } else { - return (0); - } - } - - void - zmutex_exit(kmutex_t *mp) - { - ASSERT(mp->initialized == B_TRUE); - ASSERT(mutex_owner(mp) == curthread); - mp->m_owner = NULL; - VERIFY(mutex_unlock(&mp->m_lock) == 0); - } - - void * - mutex_owner(kmutex_t *mp) - { - ASSERT(mp->initialized == B_TRUE); - return (mp->m_owner); - } - - /* - * ========================================================================= - * rwlocks - * ========================================================================= - */ - /*ARGSUSED*/ - void - rw_init(krwlock_t *rwlp, char *name, int type, void *arg) - { - rwlock_init(&rwlp->rw_lock, USYNC_THREAD, NULL); - rwlp->rw_owner = NULL; - rwlp->initialized = B_TRUE; - } - - void - rw_destroy(krwlock_t *rwlp) - { - rwlock_destroy(&rwlp->rw_lock); - rwlp->rw_owner = (void *)-1UL; - rwlp->initialized = B_FALSE; - } - - void - rw_enter(krwlock_t *rwlp, krw_t rw) - { - ASSERT(!RW_LOCK_HELD(rwlp)); - ASSERT(rwlp->initialized == B_TRUE); - ASSERT(rwlp->rw_owner != (void *)-1UL); - ASSERT(rwlp->rw_owner != curthread); - - if (rw == RW_WRITER) - VERIFY(rw_wrlock(&rwlp->rw_lock) == 0); - else - VERIFY(rw_rdlock(&rwlp->rw_lock) == 0); - - rwlp->rw_owner = curthread; - } - - void - rw_exit(krwlock_t *rwlp) - { - ASSERT(rwlp->initialized == B_TRUE); - ASSERT(rwlp->rw_owner != (void *)-1UL); - - rwlp->rw_owner = NULL; - VERIFY(rw_unlock(&rwlp->rw_lock) == 0); - } - - int - rw_tryenter(krwlock_t *rwlp, krw_t rw) - { - int rv; - - ASSERT(rwlp->initialized == B_TRUE); - ASSERT(rwlp->rw_owner != (void *)-1UL); - - if (rw == RW_WRITER) - rv = rw_trywrlock(&rwlp->rw_lock); - else - rv = rw_tryrdlock(&rwlp->rw_lock); - - if (rv == 0) { - rwlp->rw_owner = curthread; - return (1); - } - - return (0); - } - - /*ARGSUSED*/ - int - rw_tryupgrade(krwlock_t *rwlp) - { - ASSERT(rwlp->initialized == B_TRUE); - ASSERT(rwlp->rw_owner != (void *)-1UL); - - return (0); - } - - /* - * ========================================================================= - * condition variables - * ========================================================================= - */ - /*ARGSUSED*/ - void - cv_init(kcondvar_t *cv, char *name, int type, void *arg) - { - VERIFY(cond_init(cv, type, NULL) == 0); - } - - void - cv_destroy(kcondvar_t *cv) - { - VERIFY(cond_destroy(cv) == 0); - } - - void - cv_wait(kcondvar_t *cv, kmutex_t *mp) - { - ASSERT(mutex_owner(mp) == curthread); - mp->m_owner = NULL; - int ret = cond_wait(cv, &mp->m_lock); - VERIFY(ret == 0 || ret == EINTR); - mp->m_owner = curthread; - } - - clock_t - cv_timedwait(kcondvar_t *cv, kmutex_t *mp, clock_t abstime) - { - int error; - timestruc_t ts; - clock_t delta; - - top: - delta = abstime - ddi_get_lbolt(); - if (delta <= 0) - return (-1); - - ts.tv_sec = delta / hz; - ts.tv_nsec = (delta % hz) * (NANOSEC / hz); - - ASSERT(mutex_owner(mp) == curthread); - mp->m_owner = NULL; - error = cond_reltimedwait(cv, &mp->m_lock, &ts); - mp->m_owner = curthread; - - if (error == ETIME) - return (-1); - - if (error == EINTR) - goto top; - - ASSERT(error == 0); - - return (1); - } - - /*ARGSUSED*/ - clock_t - cv_timedwait_hires(kcondvar_t *cv, kmutex_t *mp, hrtime_t tim, hrtime_t res, - int flag) - { - int error; - timestruc_t ts; - hrtime_t delta; - - ASSERT(flag == 0 || flag == CALLOUT_FLAG_ABSOLUTE); - - top: - delta = tim; - if (flag & CALLOUT_FLAG_ABSOLUTE) - delta -= gethrtime(); - - if (delta <= 0) - return (-1); - - ts.tv_sec = delta / NANOSEC; - ts.tv_nsec = delta % NANOSEC; - - ASSERT(mutex_owner(mp) == curthread); - mp->m_owner = NULL; - error = cond_reltimedwait(cv, &mp->m_lock, &ts); - mp->m_owner = curthread; - - if (error == ETIME) - return (-1); - - if (error == EINTR) - goto top; - - ASSERT(error == 0); - - return (1); - } - - void - cv_signal(kcondvar_t *cv) - { - VERIFY(cond_signal(cv) == 0); - } - - void - cv_broadcast(kcondvar_t *cv) - { - VERIFY(cond_broadcast(cv) == 0); - } - - /* - * ========================================================================= * vnode operations * ========================================================================= */ /* * Note: for the xxxat() versions of these functions, we assume that the --- 60,71 ----
*** 689,748 **** #endif /* ZFS_DEBUG */ /* * ========================================================================= - * cmn_err() and panic() - * ========================================================================= - */ - static char ce_prefix[CE_IGNORE][10] = { "", "NOTICE: ", "WARNING: ", "" }; - static char ce_suffix[CE_IGNORE][2] = { "", "\n", "\n", "" }; - - void - vpanic(const char *fmt, va_list adx) - { - char buf[512]; - (void) vsnprintf(buf, 512, fmt, adx); - assfail(buf, NULL, 0); - abort(); /* necessary to make vpanic meet noreturn requirements */ - } - - void - panic(const char *fmt, ...) - { - va_list adx; - - va_start(adx, fmt); - vpanic(fmt, adx); - va_end(adx); - } - - void - vcmn_err(int ce, const char *fmt, va_list adx) - { - if (ce == CE_PANIC) - vpanic(fmt, adx); - if (ce != CE_NOTE) { /* suppress noise in userland stress testing */ - (void) fprintf(stderr, "%s", ce_prefix[ce]); - (void) vfprintf(stderr, fmt, adx); - (void) fprintf(stderr, "%s", ce_suffix[ce]); - } - } - - /*PRINTFLIKE2*/ - void - cmn_err(int ce, const char *fmt, ...) - { - va_list adx; - - va_start(adx, fmt); - vcmn_err(ce, fmt, adx); - va_end(adx); - } - - /* - * ========================================================================= * kobj interfaces * ========================================================================= */ struct _buf * kobj_open_file(char *name) --- 361,370 ----
*** 792,919 **** return (0); } /* * ========================================================================= - * misc routines - * ========================================================================= - */ - - void - delay(clock_t ticks) - { - poll(0, 0, ticks * (1000 / hz)); - } - - /* - * Find highest one bit set. - * Returns bit number + 1 of highest bit that is set, otherwise returns 0. - */ - int - highbit64(uint64_t i) - { - int h = 1; - - if (i == 0) - return (0); - if (i & 0xffffffff00000000ULL) { - h += 32; i >>= 32; - } - if (i & 0xffff0000) { - h += 16; i >>= 16; - } - if (i & 0xff00) { - h += 8; i >>= 8; - } - if (i & 0xf0) { - h += 4; i >>= 4; - } - if (i & 0xc) { - h += 2; i >>= 2; - } - if (i & 0x2) { - h += 1; - } - return (h); - } - - static int random_fd = -1, urandom_fd = -1; - - static int - random_get_bytes_common(uint8_t *ptr, size_t len, int fd) - { - size_t resid = len; - ssize_t bytes; - - ASSERT(fd != -1); - - while (resid != 0) { - bytes = read(fd, ptr, resid); - ASSERT3S(bytes, >=, 0); - ptr += bytes; - resid -= bytes; - } - - return (0); - } - - int - random_get_bytes(uint8_t *ptr, size_t len) - { - return (random_get_bytes_common(ptr, len, random_fd)); - } - - int - random_get_pseudo_bytes(uint8_t *ptr, size_t len) - { - return (random_get_bytes_common(ptr, len, urandom_fd)); - } - - int - ddi_strtoul(const char *hw_serial, char **nptr, int base, unsigned long *result) - { - char *end; - - *result = strtoul(hw_serial, &end, base); - if (*result == 0) - return (errno); - return (0); - } - - int - ddi_strtoull(const char *str, char **nptr, int base, u_longlong_t *result) - { - char *end; - - *result = strtoull(str, &end, base); - if (*result == 0) - return (errno); - return (0); - } - - /* ARGSUSED */ - cyclic_id_t - cyclic_add(cyc_handler_t *hdlr, cyc_time_t *when) - { - return (1); - } - - /* ARGSUSED */ - void - cyclic_remove(cyclic_id_t id) - { - } - - /* ARGSUSED */ - int - cyclic_reprogram(cyclic_id_t id, hrtime_t expiration) - { - return (1); - } - - /* - * ========================================================================= * kernel emulation setup & teardown * ========================================================================= */ static int umem_out_of_memory(void) --- 414,423 ----
*** 938,950 **** (double)physmem * sysconf(_SC_PAGE_SIZE) / (1ULL << 30)); (void) snprintf(hw_serial, sizeof (hw_serial), "%ld", (mode & FWRITE) ? gethostid() : 0); - VERIFY((random_fd = open("/dev/random", O_RDONLY)) != -1); - VERIFY((urandom_fd = open("/dev/urandom", O_RDONLY)) != -1); - system_taskq_init(); mutex_init(&cpu_lock, NULL, MUTEX_DEFAULT, NULL); spa_init(mode); --- 442,451 ----
*** 956,971 **** kernel_fini(void) { spa_fini(); system_taskq_fini(); - - close(random_fd); - close(urandom_fd); - - random_fd = -1; - urandom_fd = -1; } int z_uncompress(void *dst, size_t *dstlen, const void *src, size_t srclen) { --- 457,466 ----
*** 989,1029 **** *dstlen = (size_t)len; return (ret); } - uid_t - crgetuid(cred_t *cr) - { - return (0); - } - - uid_t - crgetruid(cred_t *cr) - { - return (0); - } - - gid_t - crgetgid(cred_t *cr) - { - return (0); - } - int - crgetngroups(cred_t *cr) - { - return (0); - } - - gid_t * - crgetgroups(cred_t *cr) - { - return (NULL); - } - - int zfs_secpolicy_snapshot_perms(const char *name, cred_t *cr) { return (0); } --- 484,494 ----
*** 1037,1087 **** zfs_secpolicy_destroy_perms(const char *name, cred_t *cr) { return (0); } - ksiddomain_t * - ksid_lookupdomain(const char *dom) - { - ksiddomain_t *kd; - - kd = umem_zalloc(sizeof (ksiddomain_t), UMEM_NOFAIL); - kd->kd_name = spa_strdup(dom); - return (kd); - } - - void - ksiddomain_rele(ksiddomain_t *ksid) - { - spa_strfree(ksid->kd_name); - umem_free(ksid, sizeof (ksiddomain_t)); - } - - /* - * Do not change the length of the returned string; it must be freed - * with strfree(). - */ - char * - kmem_asprintf(const char *fmt, ...) - { - int size; - va_list adx; - char *buf; - - va_start(adx, fmt); - size = vsnprintf(NULL, 0, fmt, adx) + 1; - va_end(adx); - - buf = kmem_alloc(size, KM_SLEEP); - - va_start(adx, fmt); - size = vsnprintf(buf, size, fmt, adx); - va_end(adx); - - return (buf); - } - /* ARGSUSED */ int zfs_onexit_fd_hold(int fd, minor_t *minorp) { *minorp = 0; --- 502,511 ----
*** 1112,1162 **** /* ARGSUSED */ int zfs_onexit_cb_data(minor_t minor, uint64_t action_handle, void **data) { return (0); - } - - void - bioinit(buf_t *bp) - { - bzero(bp, sizeof (buf_t)); - } - - void - biodone(buf_t *bp) - { - if (bp->b_iodone != NULL) { - (*(bp->b_iodone))(bp); - return; - } - ASSERT((bp->b_flags & B_DONE) == 0); - bp->b_flags |= B_DONE; - } - - void - bioerror(buf_t *bp, int error) - { - ASSERT(bp != NULL); - ASSERT(error >= 0); - - if (error != 0) { - bp->b_flags |= B_ERROR; - } else { - bp->b_flags &= ~B_ERROR; - } - bp->b_error = error; - } - - - int - geterror(struct buf *bp) - { - int error = 0; - - if (bp->b_flags & B_ERROR) { - error = bp->b_error; - if (!error) - error = EIO; - } - return (error); } --- 536,541 ----