Print this page
2882 implement libzfs_core
2883 changing "canmount" property to "on" should not always remount dataset
2900 "zfs snapshot" should be able to create multiple, arbitrary snapshots at once
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed by: Chris Siden <christopher.siden@delphix.com>
Reviewed by: Garrett D'Amore <garrett@damore.org>
Reviewed by: Bill Pijewski <wdp@joyent.com>
Reviewed by: Dan Kruchinin <dan.kruchinin@gmail.com>

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/fs/zfs/dsl_deleg.c
          +++ new/usr/src/uts/common/fs/zfs/dsl_deleg.c
↓ open down ↓ 173 lines elided ↑ open up ↑
 174  174                          jumpobj = zap_create_link(mos, DMU_OT_DSL_PERMS,
 175  175                              zapobj, whokey, tx);
 176  176                  }
 177  177  
 178  178                  while (permpair = nvlist_next_nvpair(perms, permpair)) {
 179  179                          const char *perm = nvpair_name(permpair);
 180  180                          uint64_t n = 0;
 181  181  
 182  182                          VERIFY(zap_update(mos, jumpobj,
 183  183                              perm, 8, 1, &n, tx) == 0);
 184      -                        spa_history_log_internal(LOG_DS_PERM_UPDATE,
 185      -                            dd->dd_pool->dp_spa, tx,
 186      -                            "%s %s dataset = %llu", whokey, perm,
 187      -                            dd->dd_phys->dd_head_dataset_obj);
      184 +                        spa_history_log_internal_dd(dd, "permission update", tx,
      185 +                            "%s %s", whokey, perm);
 188  186                  }
 189  187          }
 190  188  }
 191  189  
 192  190  static void
 193  191  dsl_deleg_unset_sync(void *arg1, void *arg2, dmu_tx_t *tx)
 194  192  {
 195  193          dsl_dir_t *dd = arg1;
 196  194          nvlist_t *nvp = arg2;
 197  195          objset_t *mos = dd->dd_pool->dp_meta_objset;
↓ open down ↓ 8 lines elided ↑ open up ↑
 206  204                  nvlist_t *perms;
 207  205                  nvpair_t *permpair = NULL;
 208  206                  uint64_t jumpobj;
 209  207  
 210  208                  if (nvpair_value_nvlist(whopair, &perms) != 0) {
 211  209                          if (zap_lookup(mos, zapobj, whokey, 8,
 212  210                              1, &jumpobj) == 0) {
 213  211                                  (void) zap_remove(mos, zapobj, whokey, tx);
 214  212                                  VERIFY(0 == zap_destroy(mos, jumpobj, tx));
 215  213                          }
 216      -                        spa_history_log_internal(LOG_DS_PERM_WHO_REMOVE,
 217      -                            dd->dd_pool->dp_spa, tx,
 218      -                            "%s dataset = %llu", whokey,
 219      -                            dd->dd_phys->dd_head_dataset_obj);
      214 +                        spa_history_log_internal_dd(dd, "permission who remove",
      215 +                            tx, "%s", whokey);
 220  216                          continue;
 221  217                  }
 222  218  
 223  219                  if (zap_lookup(mos, zapobj, whokey, 8, 1, &jumpobj) != 0)
 224  220                          continue;
 225  221  
 226  222                  while (permpair = nvlist_next_nvpair(perms, permpair)) {
 227  223                          const char *perm = nvpair_name(permpair);
 228  224                          uint64_t n = 0;
 229  225  
 230  226                          (void) zap_remove(mos, jumpobj, perm, tx);
 231  227                          if (zap_count(mos, jumpobj, &n) == 0 && n == 0) {
 232  228                                  (void) zap_remove(mos, zapobj,
 233  229                                      whokey, tx);
 234  230                                  VERIFY(0 == zap_destroy(mos,
 235  231                                      jumpobj, tx));
 236  232                          }
 237      -                        spa_history_log_internal(LOG_DS_PERM_REMOVE,
 238      -                            dd->dd_pool->dp_spa, tx,
 239      -                            "%s %s dataset = %llu", whokey, perm,
 240      -                            dd->dd_phys->dd_head_dataset_obj);
      233 +                        spa_history_log_internal_dd(dd, "permission remove", tx,
      234 +                            "%s %s", whokey, perm);
 241  235                  }
 242  236          }
 243  237  }
 244  238  
 245  239  int
 246  240  dsl_deleg_set(const char *ddname, nvlist_t *nvp, boolean_t unset)
 247  241  {
 248  242          dsl_dir_t *dd;
 249  243          int error;
 250  244          nvpair_t *whopair = NULL;
↓ open down ↓ 266 lines elided ↑ open up ↑
 517  511          ngids = crgetngroups(cr);
 518  512          gids = crgetgroups(cr);
 519  513          for (i = 0; i != ngids; i++) {
 520  514                  id = gids[i];
 521  515                  (void) dsl_load_sets(mos, zapobj,
 522  516                      ZFS_DELEG_GROUP_SETS, checkflag, &id, avl);
 523  517          }
 524  518  }
 525  519  
 526  520  /*
 527      - * Check if user has requested permission.  If descendent is set, must have
 528      - * descendent perms.
      521 + * Check if user has requested permission.
 529  522   */
 530  523  int
 531      -dsl_deleg_access_impl(dsl_dataset_t *ds, boolean_t descendent, const char *perm,
 532      -    cred_t *cr)
      524 +dsl_deleg_access_impl(dsl_dataset_t *ds, const char *perm, cred_t *cr)
 533  525  {
 534  526          dsl_dir_t *dd;
 535  527          dsl_pool_t *dp;
 536  528          void *cookie;
 537  529          int     error;
 538  530          char    checkflag;
 539  531          objset_t *mos;
 540  532          avl_tree_t permsets;
 541  533          perm_set_t *setnode;
 542  534  
 543  535          dp = ds->ds_dir->dd_pool;
 544  536          mos = dp->dp_meta_objset;
 545  537  
 546  538          if (dsl_delegation_on(mos) == B_FALSE)
 547  539                  return (ECANCELED);
 548  540  
 549  541          if (spa_version(dmu_objset_spa(dp->dp_meta_objset)) <
 550  542              SPA_VERSION_DELEGATED_PERMS)
 551  543                  return (EPERM);
 552  544  
 553      -        if (dsl_dataset_is_snapshot(ds) || descendent) {
      545 +        if (dsl_dataset_is_snapshot(ds)) {
 554  546                  /*
 555  547                   * Snapshots are treated as descendents only,
 556  548                   * local permissions do not apply.
 557  549                   */
 558  550                  checkflag = ZFS_DELEG_DESCENDENT;
 559  551          } else {
 560  552                  checkflag = ZFS_DELEG_LOCAL;
 561  553          }
 562  554  
 563  555          avl_create(&permsets, perm_set_compare, sizeof (perm_set_t),
↓ open down ↓ 72 lines elided ↑ open up ↑
 636  628  int
 637  629  dsl_deleg_access(const char *dsname, const char *perm, cred_t *cr)
 638  630  {
 639  631          dsl_dataset_t *ds;
 640  632          int error;
 641  633  
 642  634          error = dsl_dataset_hold(dsname, FTAG, &ds);
 643  635          if (error)
 644  636                  return (error);
 645  637  
 646      -        error = dsl_deleg_access_impl(ds, B_FALSE, perm, cr);
      638 +        error = dsl_deleg_access_impl(ds, perm, cr);
 647  639          dsl_dataset_rele(ds, FTAG);
 648  640  
 649  641          return (error);
 650  642  }
 651  643  
 652  644  /*
 653  645   * Other routines.
 654  646   */
 655  647  
 656  648  static void
↓ open down ↓ 91 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX