544 {
545 dsl_dir_t *dd;
546 dsl_pool_t *dp;
547 void *cookie;
548 int error;
549 char checkflag;
550 objset_t *mos;
551 avl_tree_t permsets;
552 perm_set_t *setnode;
553
554 dp = ds->ds_dir->dd_pool;
555 mos = dp->dp_meta_objset;
556
557 if (dsl_delegation_on(mos) == B_FALSE)
558 return (SET_ERROR(ECANCELED));
559
560 if (spa_version(dmu_objset_spa(dp->dp_meta_objset)) <
561 SPA_VERSION_DELEGATED_PERMS)
562 return (SET_ERROR(EPERM));
563
564 if (dsl_dataset_is_snapshot(ds)) {
565 /*
566 * Snapshots are treated as descendents only,
567 * local permissions do not apply.
568 */
569 checkflag = ZFS_DELEG_DESCENDENT;
570 } else {
571 checkflag = ZFS_DELEG_LOCAL;
572 }
573
574 avl_create(&permsets, perm_set_compare, sizeof (perm_set_t),
575 offsetof(perm_set_t, p_node));
576
577 ASSERT(dsl_pool_config_held(dp));
578 for (dd = ds->ds_dir; dd != NULL; dd = dd->dd_parent,
579 checkflag = ZFS_DELEG_DESCENDENT) {
580 uint64_t zapobj;
581 boolean_t expanded;
582
583 /*
584 * If not in global zone then make sure
|
544 {
545 dsl_dir_t *dd;
546 dsl_pool_t *dp;
547 void *cookie;
548 int error;
549 char checkflag;
550 objset_t *mos;
551 avl_tree_t permsets;
552 perm_set_t *setnode;
553
554 dp = ds->ds_dir->dd_pool;
555 mos = dp->dp_meta_objset;
556
557 if (dsl_delegation_on(mos) == B_FALSE)
558 return (SET_ERROR(ECANCELED));
559
560 if (spa_version(dmu_objset_spa(dp->dp_meta_objset)) <
561 SPA_VERSION_DELEGATED_PERMS)
562 return (SET_ERROR(EPERM));
563
564 if (ds->ds_is_snapshot) {
565 /*
566 * Snapshots are treated as descendents only,
567 * local permissions do not apply.
568 */
569 checkflag = ZFS_DELEG_DESCENDENT;
570 } else {
571 checkflag = ZFS_DELEG_LOCAL;
572 }
573
574 avl_create(&permsets, perm_set_compare, sizeof (perm_set_t),
575 offsetof(perm_set_t, p_node));
576
577 ASSERT(dsl_pool_config_held(dp));
578 for (dd = ds->ds_dir; dd != NULL; dd = dd->dd_parent,
579 checkflag = ZFS_DELEG_DESCENDENT) {
580 uint64_t zapobj;
581 boolean_t expanded;
582
583 /*
584 * If not in global zone then make sure
|