Lines Matching +full:n +full:- +full:mos
1 // SPDX-License-Identifier: CDDL-1.0
10 * or https://opensource.org/licenses/CDDL-1.0.
53 * c-$ identifies permission to create at dataset creation time.
54 * C-$ identifies permission sets to grant locally at dataset creation
56 * s-$@<name> permissions defined in specified set @<name>
57 * S-$@<name> Sets defined in named set @<name>
65 * ul$12 -> ZAP OBJ -> permissions...
162 objset_t *mos = dp->dp_meta_objset; in dsl_deleg_set_sync() local
166 VERIFY0(dsl_dir_hold(dp, dda->dda_name, FTAG, &dd, NULL)); in dsl_deleg_set_sync()
168 zapobj = dsl_dir_phys(dd)->dd_deleg_zapobj; in dsl_deleg_set_sync()
170 dmu_buf_will_dirty(dd->dd_dbuf, tx); in dsl_deleg_set_sync()
171 zapobj = dsl_dir_phys(dd)->dd_deleg_zapobj = zap_create(mos, in dsl_deleg_set_sync()
175 while ((whopair = nvlist_next_nvpair(dda->dda_nvlist, whopair))) { in dsl_deleg_set_sync()
183 if (zap_lookup(mos, zapobj, whokey, 8, 1, &jumpobj) != 0) { in dsl_deleg_set_sync()
184 jumpobj = zap_create_link(mos, DMU_OT_DSL_PERMS, in dsl_deleg_set_sync()
190 uint64_t n = 0; in dsl_deleg_set_sync() local
192 VERIFY(zap_update(mos, jumpobj, in dsl_deleg_set_sync()
193 perm, 8, 1, &n, tx) == 0); in dsl_deleg_set_sync()
207 objset_t *mos = dp->dp_meta_objset; in dsl_deleg_unset_sync() local
211 VERIFY0(dsl_dir_hold(dp, dda->dda_name, FTAG, &dd, NULL)); in dsl_deleg_unset_sync()
212 zapobj = dsl_dir_phys(dd)->dd_deleg_zapobj; in dsl_deleg_unset_sync()
218 while ((whopair = nvlist_next_nvpair(dda->dda_nvlist, whopair))) { in dsl_deleg_unset_sync()
225 if (zap_lookup(mos, zapobj, whokey, 8, in dsl_deleg_unset_sync()
227 (void) zap_remove(mos, zapobj, whokey, tx); in dsl_deleg_unset_sync()
228 VERIFY(0 == zap_destroy(mos, jumpobj, tx)); in dsl_deleg_unset_sync()
235 if (zap_lookup(mos, zapobj, whokey, 8, 1, &jumpobj) != 0) in dsl_deleg_unset_sync()
240 uint64_t n = 0; in dsl_deleg_unset_sync() local
242 (void) zap_remove(mos, jumpobj, perm, tx); in dsl_deleg_unset_sync()
243 if (zap_count(mos, jumpobj, &n) == 0 && n == 0) { in dsl_deleg_unset_sync()
244 (void) zap_remove(mos, zapobj, in dsl_deleg_unset_sync()
246 VERIFY(0 == zap_destroy(mos, in dsl_deleg_unset_sync()
263 if (spa_version(dmu_tx_pool(tx)->dp_spa) < in dsl_deleg_check()
268 error = dsl_dir_hold(dmu_tx_pool(tx), dda->dda_name, FTAG, &dd, NULL); in dsl_deleg_check()
300 * { source fsname -> { whokeys { permissions,...}, ...}}
312 objset_t *mos; in dsl_deleg_get() local
327 dp = startdd->dd_pool; in dsl_deleg_get()
328 mos = dp->dp_meta_objset; in dsl_deleg_get()
337 for (dd = startdd; dd != NULL; dd = dd->dd_parent) { in dsl_deleg_get()
339 uint64_t n; in dsl_deleg_get() local
341 if (dsl_dir_phys(dd)->dd_deleg_zapobj == 0 || in dsl_deleg_get()
342 zap_count(mos, in dsl_deleg_get()
343 dsl_dir_phys(dd)->dd_deleg_zapobj, &n) != 0 || n == 0) in dsl_deleg_get()
347 for (zap_cursor_init(basezc, mos, in dsl_deleg_get()
348 dsl_dir_phys(dd)->dd_deleg_zapobj); in dsl_deleg_get()
353 ASSERT(baseza->za_integer_length == 8); in dsl_deleg_get()
354 ASSERT(baseza->za_num_integers == 1); in dsl_deleg_get()
357 for (zap_cursor_init(zc, mos, baseza->za_first_integer); in dsl_deleg_get()
360 fnvlist_add_boolean(perms_nvp, za->za_name); in dsl_deleg_get()
363 fnvlist_add_nvlist(sp_nvp, baseza->za_name, perms_nvp); in dsl_deleg_get()
386 * Routines for dsl_deleg_access() -- access checking.
401 val = strcmp(node1->p_setname, node2->p_setname); in perm_set_compare()
417 dsl_check_access(objset_t *mos, uint64_t zapobj, in dsl_check_access() argument
425 error = zap_lookup(mos, zapobj, whokey, 8, 1, &jumpobj); in dsl_check_access()
427 error = zap_lookup(mos, jumpobj, perm, 8, 1, &zero); in dsl_check_access()
438 dsl_check_user_access(objset_t *mos, uint64_t zapobj, const char *perm, in dsl_check_user_access() argument
448 if (dsl_check_access(mos, zapobj, in dsl_check_user_access()
454 if (dsl_check_access(mos, zapobj, in dsl_check_user_access()
459 id = -1; in dsl_check_user_access()
460 if (dsl_check_access(mos, zapobj, in dsl_check_user_access()
469 if (dsl_check_access(mos, zapobj, in dsl_check_user_access()
482 dsl_load_sets(objset_t *mos, uint64_t zapobj, in dsl_load_sets() argument
495 error = zap_lookup(mos, zapobj, whokey, 8, 1, &jumpobj); in dsl_load_sets()
500 for (zap_cursor_init(&zc, mos, jumpobj); in dsl_load_sets()
504 (void) strlcpy(permnode->p_setname, za->za_name, in dsl_load_sets()
505 sizeof (permnode->p_setname)); in dsl_load_sets()
506 permnode->p_matched = B_FALSE; in dsl_load_sets()
523 dsl_load_user_sets(objset_t *mos, uint64_t zapobj, avl_tree_t *avl, in dsl_load_user_sets() argument
531 (void) dsl_load_sets(mos, zapobj, in dsl_load_user_sets()
535 (void) dsl_load_sets(mos, zapobj, in dsl_load_user_sets()
538 (void) dsl_load_sets(mos, zapobj, in dsl_load_user_sets()
545 (void) dsl_load_sets(mos, zapobj, in dsl_load_user_sets()
561 objset_t *mos; in dsl_deleg_access_impl() local
565 dp = ds->ds_dir->dd_pool; in dsl_deleg_access_impl()
566 mos = dp->dp_meta_objset; in dsl_deleg_access_impl()
568 if (dsl_delegation_on(mos) == B_FALSE) in dsl_deleg_access_impl()
571 if (spa_version(dmu_objset_spa(dp->dp_meta_objset)) < in dsl_deleg_access_impl()
575 if (ds->ds_is_snapshot) { in dsl_deleg_access_impl()
589 for (dd = ds->ds_dir; dd != NULL; dd = dd->dd_parent, in dsl_deleg_access_impl()
608 zapobj = dsl_dir_phys(dd)->dd_deleg_zapobj; in dsl_deleg_access_impl()
613 dsl_load_user_sets(mos, zapobj, &permsets, checkflag, cr); in dsl_deleg_access_impl()
618 if (setnode->p_matched == B_TRUE) in dsl_deleg_access_impl()
622 error = dsl_check_access(mos, zapobj, in dsl_deleg_access_impl()
623 ZFS_DELEG_NAMED_SET, 0, setnode->p_setname, perm); in dsl_deleg_access_impl()
627 setnode->p_matched = B_TRUE; in dsl_deleg_access_impl()
630 error = dsl_load_sets(mos, zapobj, in dsl_deleg_access_impl()
632 setnode->p_setname, &permsets); in dsl_deleg_access_impl()
634 setnode->p_matched = expanded = B_TRUE; in dsl_deleg_access_impl()
643 error = dsl_check_user_access(mos, zapobj, perm, checkflag, cr); in dsl_deleg_access_impl()
685 objset_t *mos = dd->dd_pool->dp_meta_objset; in copy_create_perms() local
687 uint64_t zapobj = dsl_dir_phys(dd)->dd_deleg_zapobj; in copy_create_perms()
695 if (zap_lookup(mos, pzapobj, whokey, 8, 1, &pjumpobj) != 0) in copy_create_perms()
699 dmu_buf_will_dirty(dd->dd_dbuf, tx); in copy_create_perms()
700 zapobj = dsl_dir_phys(dd)->dd_deleg_zapobj = zap_create(mos, in copy_create_perms()
707 if (zap_lookup(mos, zapobj, whokey, 8, 1, &jumpobj) == ENOENT) { in copy_create_perms()
708 jumpobj = zap_create(mos, DMU_OT_DSL_PERMS, DMU_OT_NONE, 0, tx); in copy_create_perms()
709 VERIFY(zap_add(mos, zapobj, whokey, 8, 1, &jumpobj, tx) == 0); in copy_create_perms()
713 for (zap_cursor_init(&zc, mos, pjumpobj); in copy_create_perms()
717 ASSERT(za->za_integer_length == 8 && za->za_num_integers == 1); in copy_create_perms()
719 VERIFY(zap_update(mos, jumpobj, za->za_name, in copy_create_perms()
735 if (spa_version(dmu_objset_spa(sdd->dd_pool->dp_meta_objset)) < in dsl_deleg_set_create_perms()
739 for (dd = sdd->dd_parent; dd != NULL; dd = dd->dd_parent) { in dsl_deleg_set_create_perms()
740 uint64_t pzapobj = dsl_dir_phys(dd)->dd_deleg_zapobj; in dsl_deleg_set_create_perms()
751 dsl_deleg_destroy(objset_t *mos, uint64_t zapobj, dmu_tx_t *tx) in dsl_deleg_destroy() argument
760 for (zap_cursor_init(&zc, mos, zapobj); in dsl_deleg_destroy()
763 ASSERT(za->za_integer_length == 8 && za->za_num_integers == 1); in dsl_deleg_destroy()
764 VERIFY(0 == zap_destroy(mos, za->za_first_integer, tx)); in dsl_deleg_destroy()
767 VERIFY(0 == zap_destroy(mos, zapobj, tx)); in dsl_deleg_destroy()
775 return (!!spa_delegation(os->os_spa)); in dsl_delegation_on()