X-Git-Url: https://git.camperquake.de/gitweb.cgi?a=blobdiff_plain;f=module%2Fzfs%2Fdsl_deleg.c;h=4d7ec80a18a637043c13686f76a97d0b1ec18f14;hb=c65aa5b2b9c48375ea1c451f252f0056e16f4e49;hp=85490c8d5fd9247743f9ff6ea7ff9d285984d183;hpb=428870ff734fdaccc342b33fc53cf94724409a46;p=zfs.git diff --git a/module/zfs/dsl_deleg.c b/module/zfs/dsl_deleg.c index 85490c8..4d7ec80 100644 --- a/module/zfs/dsl_deleg.c +++ b/module/zfs/dsl_deleg.c @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. */ /* @@ -96,13 +96,13 @@ dsl_deleg_can_allow(char *ddname, nvlist_t *nvp, cred_t *cr) if ((error = dsl_deleg_access(ddname, ZFS_DELEG_PERM_ALLOW, cr)) != 0) return (error); - while (whopair = nvlist_next_nvpair(nvp, whopair)) { + while ((whopair = nvlist_next_nvpair(nvp, whopair))) { nvlist_t *perms; nvpair_t *permpair = NULL; VERIFY(nvpair_value_nvlist(whopair, &perms) == 0); - while (permpair = nvlist_next_nvpair(perms, permpair)) { + while ((permpair = nvlist_next_nvpair(perms, permpair))) { const char *perm = nvpair_name(permpair); if (strcmp(perm, ZFS_DELEG_PERM_ALLOW) == 0) @@ -133,7 +133,7 @@ dsl_deleg_can_unallow(char *ddname, nvlist_t *nvp, cred_t *cr) (void) snprintf(idstr, sizeof (idstr), "%lld", (longlong_t)crgetuid(cr)); - while (whopair = nvlist_next_nvpair(nvp, whopair)) { + while ((whopair = nvlist_next_nvpair(nvp, whopair))) { zfs_deleg_who_type_t type = nvpair_name(whopair)[0]; if (type != ZFS_DELEG_USER && @@ -161,7 +161,7 @@ dsl_deleg_set_sync(void *arg1, void *arg2, dmu_tx_t *tx) DMU_OT_DSL_PERMS, DMU_OT_NONE, 0, tx); } - while (whopair = nvlist_next_nvpair(nvp, whopair)) { + while ((whopair = nvlist_next_nvpair(nvp, whopair))) { const char *whokey = nvpair_name(whopair); nvlist_t *perms; nvpair_t *permpair = NULL; @@ -176,7 +176,7 @@ dsl_deleg_set_sync(void *arg1, void *arg2, dmu_tx_t *tx) whokey, 8, 1, &jumpobj, tx) == 0); } - while (permpair = nvlist_next_nvpair(perms, permpair)) { + while ((permpair = nvlist_next_nvpair(perms, permpair))) { const char *perm = nvpair_name(permpair); uint64_t n = 0; @@ -202,7 +202,7 @@ dsl_deleg_unset_sync(void *arg1, void *arg2, dmu_tx_t *tx) if (zapobj == 0) return; - while (whopair = nvlist_next_nvpair(nvp, whopair)) { + while ((whopair = nvlist_next_nvpair(nvp, whopair))) { const char *whokey = nvpair_name(whopair); nvlist_t *perms; nvpair_t *permpair = NULL; @@ -224,7 +224,7 @@ dsl_deleg_unset_sync(void *arg1, void *arg2, dmu_tx_t *tx) if (zap_lookup(mos, zapobj, whokey, 8, 1, &jumpobj) != 0) continue; - while (permpair = nvlist_next_nvpair(perms, permpair)) { + while ((permpair = nvlist_next_nvpair(perms, permpair))) { const char *perm = nvpair_name(permpair); uint64_t n = 0; @@ -261,7 +261,7 @@ dsl_deleg_set(const char *ddname, nvlist_t *nvp, boolean_t unset) return (ENOTSUP); } - while (whopair = nvlist_next_nvpair(nvp, whopair)) + while ((whopair = nvlist_next_nvpair(nvp, whopair))) blocks_modified++; error = dsl_sync_task_do(dd->dd_pool, NULL, @@ -528,9 +528,8 @@ dsl_load_user_sets(objset_t *mos, uint64_t zapobj, avl_tree_t *avl, * Check if user has requested permission. */ int -dsl_deleg_access(const char *dsname, const char *perm, cred_t *cr) +dsl_deleg_access_impl(dsl_dataset_t *ds, const char *perm, cred_t *cr) { - dsl_dataset_t *ds; dsl_dir_t *dd; dsl_pool_t *dp; void *cookie; @@ -540,23 +539,15 @@ dsl_deleg_access(const char *dsname, const char *perm, cred_t *cr) avl_tree_t permsets; perm_set_t *setnode; - error = dsl_dataset_hold(dsname, FTAG, &ds); - if (error) - return (error); - dp = ds->ds_dir->dd_pool; mos = dp->dp_meta_objset; - if (dsl_delegation_on(mos) == B_FALSE) { - dsl_dataset_rele(ds, FTAG); + if (dsl_delegation_on(mos) == B_FALSE) return (ECANCELED); - } if (spa_version(dmu_objset_spa(dp->dp_meta_objset)) < - SPA_VERSION_DELEGATED_PERMS) { - dsl_dataset_rele(ds, FTAG); + SPA_VERSION_DELEGATED_PERMS) return (EPERM); - } if (dsl_dataset_is_snapshot(ds)) { /* @@ -633,7 +624,6 @@ again: error = EPERM; success: rw_exit(&dp->dp_config_rwlock); - dsl_dataset_rele(ds, FTAG); cookie = NULL; while ((setnode = avl_destroy_nodes(&permsets, &cookie)) != NULL) @@ -642,6 +632,22 @@ success: return (error); } +int +dsl_deleg_access(const char *dsname, const char *perm, cred_t *cr) +{ + dsl_dataset_t *ds; + int error; + + error = dsl_dataset_hold(dsname, FTAG, &ds); + if (error) + return (error); + + error = dsl_deleg_access_impl(ds, perm, cr); + dsl_dataset_rele(ds, FTAG); + + return (error); +} + /* * Other routines. */