Print this page
OS-1566 dataset quota for ZFS datasets


 600 zfs_secpolicy_setprop(const char *dsname, zfs_prop_t prop, nvpair_t *propval,
 601     cred_t *cr)
 602 {
 603         char *strval;
 604 
 605         /*
 606          * Check permissions for special properties.
 607          */
 608         switch (prop) {
 609         case ZFS_PROP_DEDUP:
 610         case ZFS_PROP_COMPRESSION:
 611         case ZFS_PROP_ZONED:
 612                 /*
 613                  * Disallow setting these properties from within a local zone.
 614                  */
 615                 if (!INGLOBALZONE(curproc))
 616                         return (EPERM);
 617                 break;
 618 
 619         case ZFS_PROP_QUOTA:


 620                 if (!INGLOBALZONE(curproc)) {
 621                         uint64_t zoned;
 622                         char setpoint[MAXNAMELEN];
 623                         /*
 624                          * Unprivileged users are allowed to modify the
 625                          * quota on things *under* (ie. contained by)
 626                          * the thing they own.
 627                          */
 628                         if (dsl_prop_get_integer(dsname, "zoned", &zoned,
 629                             setpoint))
 630                                 return (EPERM);
 631                         if (!zoned || strlen(dsname) <= strlen(setpoint))
 632                                 return (EPERM);
 633                 }
 634                 break;
 635 
 636         case ZFS_PROP_MLSLABEL:
 637                 if (!is_system_labeled())
 638                         return (EPERM);
 639 


2367 
2368         if (nvpair_type(pair) == DATA_TYPE_NVLIST) {
2369                 nvlist_t *attrs;
2370                 VERIFY(nvpair_value_nvlist(pair, &attrs) == 0);
2371                 VERIFY(nvlist_lookup_nvpair(attrs, ZPROP_VALUE,
2372                     &pair) == 0);
2373         }
2374 
2375         if (zfs_prop_get_type(prop) == PROP_TYPE_STRING)
2376                 return (-1);
2377 
2378         VERIFY(0 == nvpair_value_uint64(pair, &intval));
2379 
2380         switch (prop) {
2381         case ZFS_PROP_QUOTA:
2382                 err = dsl_dir_set_quota(dsname, source, intval);
2383                 break;
2384         case ZFS_PROP_REFQUOTA:
2385                 err = dsl_dataset_set_quota(dsname, source, intval);
2386                 break;








2387         case ZFS_PROP_RESERVATION:
2388                 err = dsl_dir_set_reservation(dsname, source, intval);
2389                 break;
2390         case ZFS_PROP_REFRESERVATION:
2391                 err = dsl_dataset_set_reservation(dsname, source, intval);
2392                 break;
2393         case ZFS_PROP_VOLSIZE:
2394                 err = zvol_set_volsize(dsname, ddi_driver_major(zfs_dip),
2395                     intval);
2396                 break;
2397         case ZFS_PROP_VERSION:
2398         {
2399                 zfsvfs_t *zfsvfs;
2400 
2401                 if ((err = zfsvfs_hold(dsname, FTAG, &zfsvfs, B_TRUE)) != 0)
2402                         break;
2403 
2404                 err = zfs_set_version(zfsvfs, intval);
2405                 zfsvfs_rele(zfsvfs, FTAG);
2406 




 600 zfs_secpolicy_setprop(const char *dsname, zfs_prop_t prop, nvpair_t *propval,
 601     cred_t *cr)
 602 {
 603         char *strval;
 604 
 605         /*
 606          * Check permissions for special properties.
 607          */
 608         switch (prop) {
 609         case ZFS_PROP_DEDUP:
 610         case ZFS_PROP_COMPRESSION:
 611         case ZFS_PROP_ZONED:
 612                 /*
 613                  * Disallow setting these properties from within a local zone.
 614                  */
 615                 if (!INGLOBALZONE(curproc))
 616                         return (EPERM);
 617                 break;
 618 
 619         case ZFS_PROP_QUOTA:
 620         case ZFS_PROP_DATASET_QUOTA:
 621         case ZFS_PROP_SNAPSHOT_QUOTA:
 622                 if (!INGLOBALZONE(curproc)) {
 623                         uint64_t zoned;
 624                         char setpoint[MAXNAMELEN];
 625                         /*
 626                          * Unprivileged users are allowed to modify the
 627                          * quota on things *under* (ie. contained by)
 628                          * the thing they own.
 629                          */
 630                         if (dsl_prop_get_integer(dsname, "zoned", &zoned,
 631                             setpoint))
 632                                 return (EPERM);
 633                         if (!zoned || strlen(dsname) <= strlen(setpoint))
 634                                 return (EPERM);
 635                 }
 636                 break;
 637 
 638         case ZFS_PROP_MLSLABEL:
 639                 if (!is_system_labeled())
 640                         return (EPERM);
 641 


2369 
2370         if (nvpair_type(pair) == DATA_TYPE_NVLIST) {
2371                 nvlist_t *attrs;
2372                 VERIFY(nvpair_value_nvlist(pair, &attrs) == 0);
2373                 VERIFY(nvlist_lookup_nvpair(attrs, ZPROP_VALUE,
2374                     &pair) == 0);
2375         }
2376 
2377         if (zfs_prop_get_type(prop) == PROP_TYPE_STRING)
2378                 return (-1);
2379 
2380         VERIFY(0 == nvpair_value_uint64(pair, &intval));
2381 
2382         switch (prop) {
2383         case ZFS_PROP_QUOTA:
2384                 err = dsl_dir_set_quota(dsname, source, intval);
2385                 break;
2386         case ZFS_PROP_REFQUOTA:
2387                 err = dsl_dataset_set_quota(dsname, source, intval);
2388                 break;
2389         case ZFS_PROP_DATASET_QUOTA:
2390                 err = dsl_dir_validate_ds_ss_quota(dsname, intval,
2391                     ZFS_PROP_DATASET_QUOTA);
2392                 break;
2393         case ZFS_PROP_SNAPSHOT_QUOTA:
2394                 err = dsl_dir_validate_ds_ss_quota(dsname, intval,
2395                     ZFS_PROP_SNAPSHOT_QUOTA);
2396                 break;
2397         case ZFS_PROP_RESERVATION:
2398                 err = dsl_dir_set_reservation(dsname, source, intval);
2399                 break;
2400         case ZFS_PROP_REFRESERVATION:
2401                 err = dsl_dataset_set_reservation(dsname, source, intval);
2402                 break;
2403         case ZFS_PROP_VOLSIZE:
2404                 err = zvol_set_volsize(dsname, ddi_driver_major(zfs_dip),
2405                     intval);
2406                 break;
2407         case ZFS_PROP_VERSION:
2408         {
2409                 zfsvfs_t *zfsvfs;
2410 
2411                 if ((err = zfsvfs_hold(dsname, FTAG, &zfsvfs, B_TRUE)) != 0)
2412                         break;
2413 
2414                 err = zfs_set_version(zfsvfs, intval);
2415                 zfsvfs_rele(zfsvfs, FTAG);
2416