int dsl_deleg_set(const char *ddname, nvlist_t *nvp, boolean_t unset) { dsl_dir_t *dd; int error; nvpair_t *whopair = NULL; int blocks_modified = 0; error = dsl_dir_open(ddname, FTAG, &dd, NULL); if (error) return (error); if (spa_version(dmu_objset_spa(dd->dd_pool->dp_meta_objset)) < SPA_VERSION_DELEGATED_PERMS) { dsl_dir_close(dd, FTAG); return (ENOTSUP); } while (whopair = nvlist_next_nvpair(nvp, whopair)) blocks_modified++; error = dsl_sync_task_do(dd->dd_pool, NULL, unset ? dsl_deleg_unset_sync : dsl_deleg_set_sync, dd, nvp, blocks_modified); dsl_dir_close(dd, FTAG); return (error); }
int dsl_pool_scrub_cancel(dsl_pool_t *dp) { boolean_t complete = B_FALSE; return (dsl_sync_task_do(dp, NULL, dsl_pool_scrub_cancel_sync, dp, &complete, 3)); }
/* * Write out a history event. */ int spa_history_log(spa_t *spa, const char *history_str, history_log_type_t what) { history_arg_t ha; ASSERT(what != LOG_INTERNAL); ha.ha_history_str = history_str; ha.ha_log_type = what; (void) strlcpy(ha.ha_zone, spa_history_zone(), sizeof (ha.ha_zone)); return (dsl_sync_task_do(spa_get_dsl(spa), NULL, spa_history_log_sync, spa, &ha, 0)); }
int dmu_objset_create(const char *name, dmu_objset_type_t type, objset_t *clone_parent, uint64_t flags, void (*func)(objset_t *os, void *arg, cred_t *cr, dmu_tx_t *tx), void *arg) { dsl_dir_t *pdd; const char *tail; int err = 0; struct oscarg oa = { 0 }; ASSERT(strchr(name, '@') == NULL); err = dsl_dir_open(name, FTAG, &pdd, &tail); if (err) return (err); if (tail == NULL) { dsl_dir_close(pdd, FTAG); return (EEXIST); } dprintf("name=%s\n", name); oa.userfunc = func; oa.userarg = arg; oa.lastname = tail; oa.type = type; oa.flags = flags; if (clone_parent != NULL) { /* * You can't clone to a different type. */ if (clone_parent->os->os_phys->os_type != type) { dsl_dir_close(pdd, FTAG); return (EINVAL); } oa.clone_parent = clone_parent->os->os_dsl_dataset; } err = dsl_sync_task_do(pdd->dd_pool, dmu_objset_create_check, dmu_objset_create_sync, pdd, &oa, 5); dsl_dir_close(pdd, FTAG); return (err); }
int dsl_pool_scrub_setup(dsl_pool_t *dp, enum scrub_func func) { return (dsl_sync_task_do(dp, NULL, dsl_pool_scrub_setup_sync, dp, &func, 0)); }