*/
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011 by Delphix. All rights reserved.
*/
#include <sys/dsl_pool.h>
int zfs_write_limit_shift = 3; /* 1/8th of physical memory */
int zfs_txg_synctime_ms = 1000; /* target millisecs to sync a txg */
-uint64_t zfs_write_limit_min = 32 << 20; /* min write limit is 32MB */
-uint64_t zfs_write_limit_max = 0; /* max data payload per txg */
-uint64_t zfs_write_limit_inflated = 0;
-uint64_t zfs_write_limit_override = 0;
+unsigned long zfs_write_limit_min = 32 << 20; /* min write limit is 32MB */
+unsigned long zfs_write_limit_max = 0; /* max data payload per txg */
+unsigned long zfs_write_limit_inflated = 0;
+unsigned long zfs_write_limit_override = 0;
kmutex_t zfs_write_limit_lock;
mutex_init(&dp->dp_lock, NULL, MUTEX_DEFAULT, NULL);
- dp->dp_vnrele_taskq = taskq_create("zfs_vn_rele_taskq", 1, minclsyspri,
+ dp->dp_iput_taskq = taskq_create("zfs_iput_taskq", 1, minclsyspri,
1, 4, 0);
return (dp);
dsl_scan_fini(dp);
rw_destroy(&dp->dp_config_rwlock);
mutex_destroy(&dp->dp_lock);
- taskq_destroy(dp->dp_vnrele_taskq);
+ taskq_destroy(dp->dp_iput_taskq);
if (dp->dp_blkstats)
kmem_free(dp->dp_blkstats, sizeof (zfs_all_blkstats_t));
kmem_free(dp, sizeof (dsl_pool_t));
/* create the root objset */
VERIFY(0 == dsl_dataset_hold_obj(dp, obj, FTAG, &ds));
- os = dmu_objset_create_impl(dp->dp_spa, ds,
- dsl_dataset_get_blkptr(ds), DMU_OST_ZFS, tx);
+ VERIFY(NULL != (os = dmu_objset_create_impl(dp->dp_spa, ds,
+ dsl_dataset_get_blkptr(ds), DMU_OST_ZFS, tx)));
#ifdef _KERNEL
zfs_create_fs(os, kcred, zplprops, tx);
#endif
deadlist_enqueue_cb(void *arg, const blkptr_t *bp, dmu_tx_t *tx)
{
dsl_deadlist_t *dl = arg;
+ dsl_pool_t *dp = dmu_objset_pool(dl->dl_os);
+ rw_enter(&dp->dp_config_rwlock, RW_READER);
dsl_deadlist_insert(dl, bp, tx);
+ rw_exit(&dp->dp_config_rwlock);
return (0);
}
reserved = dp->dp_space_towrite[tx->tx_txg & TXG_MASK]
+ dp->dp_tempreserved[tx->tx_txg & TXG_MASK] / 2;
- if (reserved && reserved > write_limit)
+ if (reserved && reserved > write_limit) {
+ DMU_TX_STAT_BUMP(dmu_tx_write_limit);
return (ERESTART);
+ }
}
atomic_add_64(&dp->dp_tempreserved[tx->tx_txg & TXG_MASK], space);
}
taskq_t *
-dsl_pool_vnrele_taskq(dsl_pool_t *dp)
+dsl_pool_iput_taskq(dsl_pool_t *dp)
{
- return (dp->dp_vnrele_taskq);
+ return (dp->dp_iput_taskq);
}
/*
return (dsl_pool_user_hold_rele_impl(dp, dsobj, tag, NULL,
tx, B_FALSE));
}
+
+#if defined(_KERNEL) && defined(HAVE_SPL)
+module_param(zfs_no_write_throttle, int, 0644);
+MODULE_PARM_DESC(zfs_no_write_throttle, "Disable write throttling");
+
+module_param(zfs_write_limit_shift, int, 0444);
+MODULE_PARM_DESC(zfs_write_limit_shift, "log2(fraction of memory) per txg");
+
+module_param(zfs_txg_synctime_ms, int, 0644);
+MODULE_PARM_DESC(zfs_txg_synctime_ms, "Target milliseconds between tgx sync");
+
+module_param(zfs_write_limit_min, ulong, 0444);
+MODULE_PARM_DESC(zfs_write_limit_min, "Min tgx write limit");
+
+module_param(zfs_write_limit_max, ulong, 0444);
+MODULE_PARM_DESC(zfs_write_limit_max, "Max tgx write limit");
+
+module_param(zfs_write_limit_inflated, ulong, 0444);
+MODULE_PARM_DESC(zfs_write_limit_inflated, "Inflated tgx write limit");
+
+module_param(zfs_write_limit_override, ulong, 0444);
+MODULE_PARM_DESC(zfs_write_limit_override, "Override tgx write limit");
+#endif