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
 
 |