Print this page
2619 asynchronous destruction of ZFS file systems
2747 SPA versioning with zfs feature flags
Reviewed by: Matt Ahrens <mahrens@delphix.com>
Reviewed by: George Wilson <gwilson@delphix.com>
Reviewed by: Richard Lowe <richlowe@richlowe.net>
Reviewed by: Dan Kruchinin <dan.kruchinin@gmail.com>
Approved by: Dan McDonald <danmcd@nexenta.com>

Split Close
Expand all
Collapse all
          --- old/usr/src/lib/libzfs/common/libzfs_util.c
          +++ new/usr/src/lib/libzfs/common/libzfs_util.c
↓ open down ↓ 10 lines elided ↑ open up ↑
  11   11   * and limitations under the License.
  12   12   *
  13   13   * When distributing Covered Code, include this CDDL HEADER in each
  14   14   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15   15   * If applicable, add the following below this CDDL HEADER, with the
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
       21 +
  21   22  /*
  22   23   * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
  23      - * Copyright (c) 2011 by Delphix. All rights reserved.
       24 + * Copyright (c) 2012 by Delphix. All rights reserved.
  24   25   */
  25   26  
  26   27  /*
  27   28   * Internal utility routines for the ZFS library.
  28   29   */
  29   30  
  30   31  #include <errno.h>
  31   32  #include <fcntl.h>
  32   33  #include <libintl.h>
  33   34  #include <stdarg.h>
↓ open down ↓ 4 lines elided ↑ open up ↑
  38   39  #include <ctype.h>
  39   40  #include <math.h>
  40   41  #include <sys/mnttab.h>
  41   42  #include <sys/mntent.h>
  42   43  #include <sys/types.h>
  43   44  
  44   45  #include <libzfs.h>
  45   46  
  46   47  #include "libzfs_impl.h"
  47   48  #include "zfs_prop.h"
       49 +#include "zfeature_common.h"
  48   50  
  49   51  int
  50   52  libzfs_errno(libzfs_handle_t *hdl)
  51   53  {
  52   54          return (hdl->libzfs_error);
  53   55  }
  54   56  
  55   57  const char *
  56   58  libzfs_error_action(libzfs_handle_t *hdl)
  57   59  {
↓ open down ↓ 47 lines elided ↑ open up ↑
 105  107                  return (dgettext(TEXT_DOMAIN, "invalid target vdev"));
 106  108          case EZFS_NODEVICE:
 107  109                  return (dgettext(TEXT_DOMAIN, "no such device in pool"));
 108  110          case EZFS_BADDEV:
 109  111                  return (dgettext(TEXT_DOMAIN, "invalid device"));
 110  112          case EZFS_NOREPLICAS:
 111  113                  return (dgettext(TEXT_DOMAIN, "no valid replicas"));
 112  114          case EZFS_RESILVERING:
 113  115                  return (dgettext(TEXT_DOMAIN, "currently resilvering"));
 114  116          case EZFS_BADVERSION:
 115      -                return (dgettext(TEXT_DOMAIN, "unsupported version"));
      117 +                return (dgettext(TEXT_DOMAIN, "unsupported version or "
      118 +                    "feature"));
 116  119          case EZFS_POOLUNAVAIL:
 117  120                  return (dgettext(TEXT_DOMAIN, "pool is unavailable"));
 118  121          case EZFS_DEVOVERFLOW:
 119  122                  return (dgettext(TEXT_DOMAIN, "too many devices in one vdev"));
 120  123          case EZFS_BADPATH:
 121  124                  return (dgettext(TEXT_DOMAIN, "must be an absolute path"));
 122  125          case EZFS_CROSSTARGET:
 123  126                  return (dgettext(TEXT_DOMAIN, "operation crosses datasets or "
 124  127                      "pools"));
 125  128          case EZFS_ZONED:
↓ open down ↓ 496 lines elided ↑ open up ↑
 622  625          if ((hdl->libzfs_mnttab = fopen(MNTTAB, "r")) == NULL) {
 623  626                  (void) close(hdl->libzfs_fd);
 624  627                  free(hdl);
 625  628                  return (NULL);
 626  629          }
 627  630  
 628  631          hdl->libzfs_sharetab = fopen("/etc/dfs/sharetab", "r");
 629  632  
 630  633          zfs_prop_init();
 631  634          zpool_prop_init();
      635 +        zpool_feature_init();
 632  636          libzfs_mnttab_init(hdl);
 633  637  
 634  638          return (hdl);
 635  639  }
 636  640  
 637  641  void
 638  642  libzfs_fini(libzfs_handle_t *hdl)
 639  643  {
 640  644          (void) close(hdl->libzfs_fd);
 641  645          if (hdl->libzfs_mnttab)
↓ open down ↓ 633 lines elided ↑ open up ↑
1275 1279          prop = zprop_name_to_prop(propname, type);
1276 1280  
1277 1281          if (prop != ZPROP_INVAL && !zprop_valid_for_type(prop, type))
1278 1282                  prop = ZPROP_INVAL;
1279 1283  
1280 1284          /*
1281 1285           * When no property table entry can be found, return failure if
1282 1286           * this is a pool property or if this isn't a user-defined
1283 1287           * dataset property,
1284 1288           */
1285      -        if (prop == ZPROP_INVAL && (type == ZFS_TYPE_POOL ||
1286      -            (!zfs_prop_user(propname) && !zfs_prop_userquota(propname) &&
1287      -            !zfs_prop_written(propname)))) {
     1289 +        if (prop == ZPROP_INVAL && ((type == ZFS_TYPE_POOL &&
     1290 +            !zpool_prop_feature(propname) &&
     1291 +            !zpool_prop_unsupported(propname)) ||
     1292 +            (type == ZFS_TYPE_DATASET && !zfs_prop_user(propname) &&
     1293 +            !zfs_prop_userquota(propname) && !zfs_prop_written(propname)))) {
1288 1294                  zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1289 1295                      "invalid property '%s'"), propname);
1290 1296                  return (zfs_error(hdl, EZFS_BADPROP,
1291 1297                      dgettext(TEXT_DOMAIN, "bad property list")));
1292 1298          }
1293 1299  
1294 1300          if ((entry = zfs_alloc(hdl, sizeof (zprop_list_t))) == NULL)
1295 1301                  return (-1);
1296 1302  
1297 1303          entry->pl_prop = prop;
1298 1304          if (prop == ZPROP_INVAL) {
1299      -                if ((entry->pl_user_prop = zfs_strdup(hdl, propname)) == NULL) {
     1305 +                if ((entry->pl_user_prop = zfs_strdup(hdl, propname)) ==
     1306 +                    NULL) {
1300 1307                          free(entry);
1301 1308                          return (-1);
1302 1309                  }
1303 1310                  entry->pl_width = strlen(propname);
1304 1311          } else {
1305 1312                  entry->pl_width = zprop_width(prop, &entry->pl_fixed,
1306 1313                      type);
1307 1314          }
1308 1315  
1309 1316          *listp = entry;
↓ open down ↓ 176 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX