summaryrefslogtreecommitdiffstats
path: root/sys/cddl/contrib
diff options
context:
space:
mode:
Diffstat (limited to 'sys/cddl/contrib')
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c28
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c14
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_misc.c4
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio_impl.h5
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c14
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c4
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c27
7 files changed, 73 insertions, 23 deletions
diff --git a/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c b/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
index 729a2cb..dd4ec77 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
@@ -278,8 +278,6 @@ static kmutex_t dtrace_meta_lock; /* meta-provider state lock */
#if !defined(sun)
/* XXX FreeBSD hacks. */
-static kmutex_t mod_lock;
-
#define cr_suid cr_svuid
#define cr_sgid cr_svgid
#define ipaddr_t in_addr_t
@@ -7678,7 +7676,9 @@ dtrace_unregister(dtrace_provider_id_t id)
}
} else {
mutex_enter(&dtrace_provider_lock);
+#if defined(sun)
mutex_enter(&mod_lock);
+#endif
mutex_enter(&dtrace_lock);
}
@@ -7692,7 +7692,9 @@ dtrace_unregister(dtrace_provider_id_t id)
dtrace_anon.dta_state->dts_necbs > 0))) {
if (!self) {
mutex_exit(&dtrace_lock);
+#if defined(sun)
mutex_exit(&mod_lock);
+#endif
mutex_exit(&dtrace_provider_lock);
}
return (EBUSY);
@@ -7726,7 +7728,9 @@ dtrace_unregister(dtrace_provider_id_t id)
if (!self) {
mutex_exit(&dtrace_lock);
+#if defined(sun)
mutex_exit(&mod_lock);
+#endif
mutex_exit(&dtrace_provider_lock);
}
@@ -7808,7 +7812,9 @@ dtrace_unregister(dtrace_provider_id_t id)
if (!self) {
mutex_exit(&dtrace_lock);
+#if defined(sun)
mutex_exit(&mod_lock);
+#endif
mutex_exit(&dtrace_provider_lock);
}
@@ -8141,6 +8147,7 @@ dtrace_probe_provide(dtrace_probedesc_t *desc, dtrace_provider_t *prv)
*/
prv->dtpv_pops.dtps_provide(prv->dtpv_arg, desc);
+#if defined(sun)
/*
* Now call the per-module provide operation. We will grab
* mod_lock to prevent the list from being modified. Note
@@ -8149,7 +8156,6 @@ dtrace_probe_provide(dtrace_probedesc_t *desc, dtrace_provider_t *prv)
*/
mutex_enter(&mod_lock);
-#if defined(sun)
ctl = &modules;
do {
if (ctl->mod_busy || ctl->mod_mp == NULL)
@@ -8158,11 +8164,11 @@ dtrace_probe_provide(dtrace_probedesc_t *desc, dtrace_provider_t *prv)
prv->dtpv_pops.dtps_provide_module(prv->dtpv_arg, ctl);
} while ((ctl = ctl->mod_next) != &modules);
+
+ mutex_exit(&mod_lock);
#else
(void) linker_file_foreach(dtrace_probe_provide_cb, prv);
#endif
-
- mutex_exit(&mod_lock);
} while (all && (prv = prv->dtpv_next) != NULL);
}
@@ -15156,7 +15162,9 @@ dtrace_module_loaded(modctl_t *ctl)
dtrace_provider_t *prv;
mutex_enter(&dtrace_provider_lock);
+#if defined(sun)
mutex_enter(&mod_lock);
+#endif
ASSERT(ctl->mod_busy);
@@ -15167,7 +15175,9 @@ dtrace_module_loaded(modctl_t *ctl)
for (prv = dtrace_provider; prv != NULL; prv = prv->dtpv_next)
prv->dtpv_pops.dtps_provide_module(prv->dtpv_arg, ctl);
+#if defined(sun)
mutex_exit(&mod_lock);
+#endif
mutex_exit(&dtrace_provider_lock);
/*
@@ -15212,7 +15222,9 @@ dtrace_module_unloaded(modctl_t *ctl)
template.dtpr_mod = ctl->mod_modname;
mutex_enter(&dtrace_provider_lock);
+#if defined(sun)
mutex_enter(&mod_lock);
+#endif
mutex_enter(&dtrace_lock);
if (dtrace_bymod == NULL) {
@@ -15221,7 +15233,9 @@ dtrace_module_unloaded(modctl_t *ctl)
* we don't have any work to do.
*/
mutex_exit(&dtrace_provider_lock);
+#if defined(sun)
mutex_exit(&mod_lock);
+#endif
mutex_exit(&dtrace_lock);
return;
}
@@ -15230,7 +15244,9 @@ dtrace_module_unloaded(modctl_t *ctl)
probe != NULL; probe = probe->dtpr_nextmod) {
if (probe->dtpr_ecb != NULL) {
mutex_exit(&dtrace_provider_lock);
+#if defined(sun)
mutex_exit(&mod_lock);
+#endif
mutex_exit(&dtrace_lock);
/*
@@ -15293,7 +15309,9 @@ dtrace_module_unloaded(modctl_t *ctl)
}
mutex_exit(&dtrace_lock);
+#if defined(sun)
mutex_exit(&mod_lock);
+#endif
mutex_exit(&dtrace_provider_lock);
}
diff --git a/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c b/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c
index f51df4c..5cf964d 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c
@@ -2283,13 +2283,6 @@ fasttrap_load(void)
return (ret);
}
- /*
- * Install our hooks into fork(2), exec(2), and exit(2).
- */
- dtrace_fasttrap_fork = &fasttrap_fork;
- dtrace_fasttrap_exit = &fasttrap_exec_exit;
- dtrace_fasttrap_exec = &fasttrap_exec_exit;
-
#if defined(sun)
fasttrap_max = ddi_getprop(DDI_DEV_T_ANY, devi, DDI_PROP_DONTPASS,
"fasttrap-max-probes", FASTTRAP_MAX_DEFAULT);
@@ -2366,6 +2359,13 @@ fasttrap_load(void)
}
#endif
+ /*
+ * Install our hooks into fork(2), exec(2), and exit(2).
+ */
+ dtrace_fasttrap_fork = &fasttrap_fork;
+ dtrace_fasttrap_exit = &fasttrap_exec_exit;
+ dtrace_fasttrap_exec = &fasttrap_exec_exit;
+
(void) dtrace_meta_register("fasttrap", &fasttrap_mops, NULL,
&fasttrap_meta_id);
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_misc.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_misc.c
index aefc41a..836c222 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_misc.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_misc.c
@@ -1697,6 +1697,10 @@ spa_boot_init()
spa_config_load();
}
+#ifdef _KERNEL
+EVENTHANDLER_DEFINE(mountroot, spa_boot_init, NULL, 0);
+#endif
+
void
spa_init(int mode)
{
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio_impl.h b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio_impl.h
index aa44744..6695c2f 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio_impl.h
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio_impl.h
@@ -24,7 +24,7 @@
*/
/*
- * Copyright (c) 2012 by Delphix. All rights reserved.
+ * Copyright (c) 2013 by Delphix. All rights reserved.
*/
#ifndef _ZIO_IMPL_H
@@ -38,7 +38,7 @@ extern "C" {
#endif
/*
- * XXX -- Describe ZFS I/O pipleine here. Fill in as needed.
+ * XXX -- Describe ZFS I/O pipeline here. Fill in as needed.
*
* The ZFS I/O pipeline is comprised of various stages which are defined
* in the zio_stage enum below. The individual stages are used to construct
@@ -213,7 +213,6 @@ enum zio_stage {
#define ZIO_FREE_PIPELINE \
(ZIO_INTERLOCK_STAGES | \
ZIO_STAGE_FREE_BP_INIT | \
- ZIO_STAGE_ISSUE_ASYNC | \
ZIO_STAGE_DVA_FREE | \
ZIO_STAGE_VDEV_IO_START | \
ZIO_STAGE_VDEV_IO_ASSESS)
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c
index 47c13ea..b7b6ef8 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c
@@ -1258,12 +1258,16 @@ vdev_open(vdev_t *vd)
vd->vdev_ashift = MAX(ashift, vd->vdev_ashift);
} else {
/*
- * Make sure the alignment requirement hasn't increased.
+ * Detect if the alignment requirement has increased.
+ * We don't want to make the pool unavailable, just
+ * issue a warning instead.
*/
- if (ashift > vd->vdev_top->vdev_ashift) {
- vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN,
- VDEV_AUX_BAD_LABEL);
- return (EINVAL);
+ if (ashift > vd->vdev_top->vdev_ashift &&
+ vd->vdev_ops->vdev_op_leaf) {
+ cmn_err(CE_WARN,
+ "Disk, '%s', has a block alignment that is "
+ "larger than the pool's alignment\n",
+ vd->vdev_path);
}
vd->vdev_max_asize = max_asize;
}
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
index d949acb..775fbb4 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
@@ -546,7 +546,9 @@ mappedread_sf(vnode_t *vp, int nbytes, uio_t *uio)
vm_page_io_finish(pp);
vm_page_lock(pp);
if (error) {
- vm_page_free(pp);
+ if (pp->wire_count == 0 && pp->valid == 0 &&
+ pp->busy == 0 && !(pp->oflags & VPO_BUSY))
+ vm_page_free(pp);
} else {
pp->valid = VM_PAGE_BITS_ALL;
vm_page_activate(pp);
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c
index c04930f..62dfe92 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c
@@ -763,7 +763,21 @@ void
zio_free(spa_t *spa, uint64_t txg, const blkptr_t *bp)
{
metaslab_check_free(spa, bp);
- bplist_append(&spa->spa_free_bplist[txg & TXG_MASK], bp);
+
+ /*
+ * Frees that are for the currently-syncing txg, are not going to be
+ * deferred, and which will not need to do a read (i.e. not GANG or
+ * DEDUP), can be processed immediately. Otherwise, put them on the
+ * in-memory list for later processing.
+ */
+ if (BP_IS_GANG(bp) || BP_GET_DEDUP(bp) ||
+ txg != spa->spa_syncing_txg ||
+ spa_sync_pass(spa) >= zfs_sync_pass_deferred_free) {
+ bplist_append(&spa->spa_free_bplist[txg & TXG_MASK], bp);
+ } else {
+ VERIFY0(zio_wait(zio_free_sync(NULL, spa, txg, bp,
+ BP_GET_PSIZE(bp), 0)));
+ }
}
zio_t *
@@ -771,6 +785,7 @@ zio_free_sync(zio_t *pio, spa_t *spa, uint64_t txg, const blkptr_t *bp,
uint64_t size, enum zio_flag flags)
{
zio_t *zio;
+ enum zio_stage stage = ZIO_FREE_PIPELINE;
dprintf_bp(bp, "freeing in txg %llu, pass %u",
(longlong_t)txg, spa->spa_sync_pass);
@@ -782,9 +797,17 @@ zio_free_sync(zio_t *pio, spa_t *spa, uint64_t txg, const blkptr_t *bp,
metaslab_check_free(spa, bp);
arc_freed(spa, bp);
+ /*
+ * GANG and DEDUP blocks can induce a read (for the gang block header,
+ * or the DDT), so issue them asynchronously so that this thread is
+ * not tied up.
+ */
+ if (BP_IS_GANG(bp) || BP_GET_DEDUP(bp))
+ stage |= ZIO_STAGE_ISSUE_ASYNC;
+
zio = zio_create(pio, spa, txg, bp, NULL, size,
NULL, NULL, ZIO_TYPE_FREE, ZIO_PRIORITY_FREE, flags,
- NULL, 0, NULL, ZIO_STAGE_OPEN, ZIO_FREE_PIPELINE);
+ NULL, 0, NULL, ZIO_STAGE_OPEN, stage);
return (zio);
}
OpenPOWER on IntegriCloud