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/uts/common/sys/nvpair.h
          +++ new/usr/src/uts/common/sys/nvpair.h
   1    1  /*
   2    2   * CDDL HEADER START
   3    3   *
   4    4   * The contents of this file are subject to the terms of the
   5    5   * Common Development and Distribution License (the "License").
   6    6   * You may not use this file except in compliance with the License.
   7    7   *
   8    8   * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9    9   * or http://www.opensolaris.org/os/licensing.
  10   10   * See the License for the specific language governing permissions
  11   11   * and limitations under the License.
  12   12   *
  
    | 
      ↓ open down ↓ | 
    12 lines elided | 
    
      ↑ open up ↑ | 
  
  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   * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
       23 + * Copyright (c) 2012 by Delphix. All rights reserved.
  23   24   */
  24   25  
  25   26  #ifndef _SYS_NVPAIR_H
  26   27  #define _SYS_NVPAIR_H
  27   28  
  28   29  #include <sys/types.h>
       30 +#include <sys/time.h>
  29   31  #include <sys/errno.h>
  30   32  #include <sys/va_list.h>
  31   33  
  32   34  #if defined(_KERNEL) && !defined(_BOOT)
  33   35  #include <sys/kmem.h>
  34   36  #endif
  35   37  
  36   38  #ifdef  __cplusplus
  37   39  extern "C" {
  38   40  #endif
  39   41  
  40   42  typedef enum {
  41   43          DATA_TYPE_UNKNOWN = 0,
  42   44          DATA_TYPE_BOOLEAN,
  43   45          DATA_TYPE_BYTE,
  44   46          DATA_TYPE_INT16,
  45   47          DATA_TYPE_UINT16,
  46   48          DATA_TYPE_INT32,
  47   49          DATA_TYPE_UINT32,
  48   50          DATA_TYPE_INT64,
  49   51          DATA_TYPE_UINT64,
  50   52          DATA_TYPE_STRING,
  51   53          DATA_TYPE_BYTE_ARRAY,
  52   54          DATA_TYPE_INT16_ARRAY,
  53   55          DATA_TYPE_UINT16_ARRAY,
  54   56          DATA_TYPE_INT32_ARRAY,
  55   57          DATA_TYPE_UINT32_ARRAY,
  56   58          DATA_TYPE_INT64_ARRAY,
  57   59          DATA_TYPE_UINT64_ARRAY,
  58   60          DATA_TYPE_STRING_ARRAY,
  59   61          DATA_TYPE_HRTIME,
  60   62          DATA_TYPE_NVLIST,
  61   63          DATA_TYPE_NVLIST_ARRAY,
  62   64          DATA_TYPE_BOOLEAN_VALUE,
  63   65          DATA_TYPE_INT8,
  64   66          DATA_TYPE_UINT8,
  65   67          DATA_TYPE_BOOLEAN_ARRAY,
  66   68          DATA_TYPE_INT8_ARRAY,
  67   69  #if !defined(_KERNEL)
  68   70          DATA_TYPE_UINT8_ARRAY,
  69   71          DATA_TYPE_DOUBLE
  70   72  #else
  71   73          DATA_TYPE_UINT8_ARRAY
  72   74  #endif
  73   75  } data_type_t;
  74   76  
  75   77  typedef struct nvpair {
  76   78          int32_t nvp_size;       /* size of this nvpair */
  77   79          int16_t nvp_name_sz;    /* length of name string */
  78   80          int16_t nvp_reserve;    /* not used */
  79   81          int32_t nvp_value_elem; /* number of elements for array types */
  80   82          data_type_t nvp_type;   /* type of value */
  81   83          /* name string */
  82   84          /* aligned ptr array for string arrays */
  83   85          /* aligned array of data for value */
  84   86  } nvpair_t;
  85   87  
  86   88  /* nvlist header */
  87   89  typedef struct nvlist {
  88   90          int32_t         nvl_version;
  89   91          uint32_t        nvl_nvflag;     /* persistent flags */
  90   92          uint64_t        nvl_priv;       /* ptr to private data if not packed */
  91   93          uint32_t        nvl_flag;
  92   94          int32_t         nvl_pad;        /* currently not used, for alignment */
  93   95  } nvlist_t;
  94   96  
  95   97  /* nvp implementation version */
  96   98  #define NV_VERSION      0
  97   99  
  98  100  /* nvlist pack encoding */
  99  101  #define NV_ENCODE_NATIVE        0
 100  102  #define NV_ENCODE_XDR           1
 101  103  
 102  104  /* nvlist persistent unique name flags, stored in nvl_nvflags */
 103  105  #define NV_UNIQUE_NAME          0x1
 104  106  #define NV_UNIQUE_NAME_TYPE     0x2
 105  107  
 106  108  /* nvlist lookup pairs related flags */
 107  109  #define NV_FLAG_NOENTOK         0x1
 108  110  
 109  111  /* convenience macros */
 110  112  #define NV_ALIGN(x)             (((ulong_t)(x) + 7ul) & ~7ul)
 111  113  #define NV_ALIGN4(x)            (((x) + 3) & ~3)
 112  114  
 113  115  #define NVP_SIZE(nvp)           ((nvp)->nvp_size)
 114  116  #define NVP_NAME(nvp)           ((char *)(nvp) + sizeof (nvpair_t))
 115  117  #define NVP_TYPE(nvp)           ((nvp)->nvp_type)
 116  118  #define NVP_NELEM(nvp)          ((nvp)->nvp_value_elem)
 117  119  #define NVP_VALUE(nvp)          ((char *)(nvp) + NV_ALIGN(sizeof (nvpair_t) \
 118  120                                  + (nvp)->nvp_name_sz))
 119  121  
 120  122  #define NVL_VERSION(nvl)        ((nvl)->nvl_version)
 121  123  #define NVL_SIZE(nvl)           ((nvl)->nvl_size)
 122  124  #define NVL_FLAG(nvl)           ((nvl)->nvl_flag)
 123  125  
 124  126  /* NV allocator framework */
 125  127  typedef struct nv_alloc_ops nv_alloc_ops_t;
 126  128  
 127  129  typedef struct nv_alloc {
 128  130          const nv_alloc_ops_t *nva_ops;
 129  131          void *nva_arg;
 130  132  } nv_alloc_t;
 131  133  
 132  134  struct nv_alloc_ops {
 133  135          int (*nv_ao_init)(nv_alloc_t *, __va_list);
 134  136          void (*nv_ao_fini)(nv_alloc_t *);
 135  137          void *(*nv_ao_alloc)(nv_alloc_t *, size_t);
 136  138          void (*nv_ao_free)(nv_alloc_t *, void *, size_t);
 137  139          void (*nv_ao_reset)(nv_alloc_t *);
 138  140  };
 139  141  
 140  142  extern const nv_alloc_ops_t *nv_fixed_ops;
 141  143  extern nv_alloc_t *nv_alloc_nosleep;
 142  144  
 143  145  #if defined(_KERNEL) && !defined(_BOOT)
 144  146  extern nv_alloc_t *nv_alloc_sleep;
 145  147  #endif
 146  148  
 147  149  int nv_alloc_init(nv_alloc_t *, const nv_alloc_ops_t *, /* args */ ...);
 148  150  void nv_alloc_reset(nv_alloc_t *);
 149  151  void nv_alloc_fini(nv_alloc_t *);
 150  152  
 151  153  /* list management */
 152  154  int nvlist_alloc(nvlist_t **, uint_t, int);
 153  155  void nvlist_free(nvlist_t *);
 154  156  int nvlist_size(nvlist_t *, size_t *, int);
 155  157  int nvlist_pack(nvlist_t *, char **, size_t *, int, int);
 156  158  int nvlist_unpack(char *, size_t, nvlist_t **, int);
 157  159  int nvlist_dup(nvlist_t *, nvlist_t **, int);
 158  160  int nvlist_merge(nvlist_t *, nvlist_t *, int);
 159  161  
 160  162  uint_t nvlist_nvflag(nvlist_t *);
 161  163  
 162  164  int nvlist_xalloc(nvlist_t **, uint_t, nv_alloc_t *);
 163  165  int nvlist_xpack(nvlist_t *, char **, size_t *, int, nv_alloc_t *);
 164  166  int nvlist_xunpack(char *, size_t, nvlist_t **, nv_alloc_t *);
 165  167  int nvlist_xdup(nvlist_t *, nvlist_t **, nv_alloc_t *);
 166  168  nv_alloc_t *nvlist_lookup_nv_alloc(nvlist_t *);
 167  169  
 168  170  int nvlist_add_nvpair(nvlist_t *, nvpair_t *);
 169  171  int nvlist_add_boolean(nvlist_t *, const char *);
 170  172  int nvlist_add_boolean_value(nvlist_t *, const char *, boolean_t);
 171  173  int nvlist_add_byte(nvlist_t *, const char *, uchar_t);
 172  174  int nvlist_add_int8(nvlist_t *, const char *, int8_t);
 173  175  int nvlist_add_uint8(nvlist_t *, const char *, uint8_t);
 174  176  int nvlist_add_int16(nvlist_t *, const char *, int16_t);
 175  177  int nvlist_add_uint16(nvlist_t *, const char *, uint16_t);
 176  178  int nvlist_add_int32(nvlist_t *, const char *, int32_t);
 177  179  int nvlist_add_uint32(nvlist_t *, const char *, uint32_t);
 178  180  int nvlist_add_int64(nvlist_t *, const char *, int64_t);
 179  181  int nvlist_add_uint64(nvlist_t *, const char *, uint64_t);
 180  182  int nvlist_add_string(nvlist_t *, const char *, const char *);
 181  183  int nvlist_add_nvlist(nvlist_t *, const char *, nvlist_t *);
 182  184  int nvlist_add_boolean_array(nvlist_t *, const char *, boolean_t *, uint_t);
 183  185  int nvlist_add_byte_array(nvlist_t *, const char *, uchar_t *, uint_t);
 184  186  int nvlist_add_int8_array(nvlist_t *, const char *, int8_t *, uint_t);
 185  187  int nvlist_add_uint8_array(nvlist_t *, const char *, uint8_t *, uint_t);
 186  188  int nvlist_add_int16_array(nvlist_t *, const char *, int16_t *, uint_t);
 187  189  int nvlist_add_uint16_array(nvlist_t *, const char *, uint16_t *, uint_t);
 188  190  int nvlist_add_int32_array(nvlist_t *, const char *, int32_t *, uint_t);
 189  191  int nvlist_add_uint32_array(nvlist_t *, const char *, uint32_t *, uint_t);
 190  192  int nvlist_add_int64_array(nvlist_t *, const char *, int64_t *, uint_t);
 191  193  int nvlist_add_uint64_array(nvlist_t *, const char *, uint64_t *, uint_t);
 192  194  int nvlist_add_string_array(nvlist_t *, const char *, char *const *, uint_t);
 193  195  int nvlist_add_nvlist_array(nvlist_t *, const char *, nvlist_t **, uint_t);
 194  196  int nvlist_add_hrtime(nvlist_t *, const char *, hrtime_t);
 195  197  #if !defined(_KERNEL)
 196  198  int nvlist_add_double(nvlist_t *, const char *, double);
 197  199  #endif
 198  200  
 199  201  int nvlist_remove(nvlist_t *, const char *, data_type_t);
 200  202  int nvlist_remove_all(nvlist_t *, const char *);
 201  203  int nvlist_remove_nvpair(nvlist_t *, nvpair_t *);
 202  204  
 203  205  int nvlist_lookup_boolean(nvlist_t *, const char *);
 204  206  int nvlist_lookup_boolean_value(nvlist_t *, const char *, boolean_t *);
 205  207  int nvlist_lookup_byte(nvlist_t *, const char *, uchar_t *);
 206  208  int nvlist_lookup_int8(nvlist_t *, const char *, int8_t *);
 207  209  int nvlist_lookup_uint8(nvlist_t *, const char *, uint8_t *);
 208  210  int nvlist_lookup_int16(nvlist_t *, const char *, int16_t *);
 209  211  int nvlist_lookup_uint16(nvlist_t *, const char *, uint16_t *);
 210  212  int nvlist_lookup_int32(nvlist_t *, const char *, int32_t *);
 211  213  int nvlist_lookup_uint32(nvlist_t *, const char *, uint32_t *);
 212  214  int nvlist_lookup_int64(nvlist_t *, const char *, int64_t *);
 213  215  int nvlist_lookup_uint64(nvlist_t *, const char *, uint64_t *);
 214  216  int nvlist_lookup_string(nvlist_t *, const char *, char **);
 215  217  int nvlist_lookup_nvlist(nvlist_t *, const char *, nvlist_t **);
 216  218  int nvlist_lookup_boolean_array(nvlist_t *, const char *,
 217  219      boolean_t **, uint_t *);
 218  220  int nvlist_lookup_byte_array(nvlist_t *, const char *, uchar_t **, uint_t *);
 219  221  int nvlist_lookup_int8_array(nvlist_t *, const char *, int8_t **, uint_t *);
 220  222  int nvlist_lookup_uint8_array(nvlist_t *, const char *, uint8_t **, uint_t *);
 221  223  int nvlist_lookup_int16_array(nvlist_t *, const char *, int16_t **, uint_t *);
 222  224  int nvlist_lookup_uint16_array(nvlist_t *, const char *, uint16_t **, uint_t *);
 223  225  int nvlist_lookup_int32_array(nvlist_t *, const char *, int32_t **, uint_t *);
 224  226  int nvlist_lookup_uint32_array(nvlist_t *, const char *, uint32_t **, uint_t *);
 225  227  int nvlist_lookup_int64_array(nvlist_t *, const char *, int64_t **, uint_t *);
 226  228  int nvlist_lookup_uint64_array(nvlist_t *, const char *, uint64_t **, uint_t *);
 227  229  int nvlist_lookup_string_array(nvlist_t *, const char *, char ***, uint_t *);
 228  230  int nvlist_lookup_nvlist_array(nvlist_t *, const char *,
 229  231      nvlist_t ***, uint_t *);
 230  232  int nvlist_lookup_hrtime(nvlist_t *, const char *, hrtime_t *);
 231  233  int nvlist_lookup_pairs(nvlist_t *, int, ...);
 232  234  #if !defined(_KERNEL)
 233  235  int nvlist_lookup_double(nvlist_t *, const char *, double *);
 234  236  #endif
 235  237  
 236  238  int nvlist_lookup_nvpair(nvlist_t *, const char *, nvpair_t **);
 237  239  int nvlist_lookup_nvpair_embedded_index(nvlist_t *, const char *, nvpair_t **,
 238  240      int *, char **);
 239  241  boolean_t nvlist_exists(nvlist_t *, const char *);
 240  242  boolean_t nvlist_empty(nvlist_t *);
 241  243  
 242  244  /* processing nvpair */
 243  245  nvpair_t *nvlist_next_nvpair(nvlist_t *, nvpair_t *);
 244  246  nvpair_t *nvlist_prev_nvpair(nvlist_t *, nvpair_t *);
 245  247  char *nvpair_name(nvpair_t *);
 246  248  data_type_t nvpair_type(nvpair_t *);
 247  249  int nvpair_type_is_array(nvpair_t *);
 248  250  int nvpair_value_boolean_value(nvpair_t *, boolean_t *);
 249  251  int nvpair_value_byte(nvpair_t *, uchar_t *);
 250  252  int nvpair_value_int8(nvpair_t *, int8_t *);
 251  253  int nvpair_value_uint8(nvpair_t *, uint8_t *);
 252  254  int nvpair_value_int16(nvpair_t *, int16_t *);
 253  255  int nvpair_value_uint16(nvpair_t *, uint16_t *);
 254  256  int nvpair_value_int32(nvpair_t *, int32_t *);
 255  257  int nvpair_value_uint32(nvpair_t *, uint32_t *);
 256  258  int nvpair_value_int64(nvpair_t *, int64_t *);
 257  259  int nvpair_value_uint64(nvpair_t *, uint64_t *);
 258  260  int nvpair_value_string(nvpair_t *, char **);
 259  261  int nvpair_value_nvlist(nvpair_t *, nvlist_t **);
 260  262  int nvpair_value_boolean_array(nvpair_t *, boolean_t **, uint_t *);
 261  263  int nvpair_value_byte_array(nvpair_t *, uchar_t **, uint_t *);
 262  264  int nvpair_value_int8_array(nvpair_t *, int8_t **, uint_t *);
 263  265  int nvpair_value_uint8_array(nvpair_t *, uint8_t **, uint_t *);
 264  266  int nvpair_value_int16_array(nvpair_t *, int16_t **, uint_t *);
 265  267  int nvpair_value_uint16_array(nvpair_t *, uint16_t **, uint_t *);
 266  268  int nvpair_value_int32_array(nvpair_t *, int32_t **, uint_t *);
  
    | 
      ↓ open down ↓ | 
    228 lines elided | 
    
      ↑ open up ↑ | 
  
 267  269  int nvpair_value_uint32_array(nvpair_t *, uint32_t **, uint_t *);
 268  270  int nvpair_value_int64_array(nvpair_t *, int64_t **, uint_t *);
 269  271  int nvpair_value_uint64_array(nvpair_t *, uint64_t **, uint_t *);
 270  272  int nvpair_value_string_array(nvpair_t *, char ***, uint_t *);
 271  273  int nvpair_value_nvlist_array(nvpair_t *, nvlist_t ***, uint_t *);
 272  274  int nvpair_value_hrtime(nvpair_t *, hrtime_t *);
 273  275  #if !defined(_KERNEL)
 274  276  int nvpair_value_double(nvpair_t *, double *);
 275  277  #endif
 276  278  
      279 +nvlist_t *fnvlist_alloc(void);
      280 +void fnvlist_free(nvlist_t *);
      281 +size_t fnvlist_size(nvlist_t *);
      282 +char *fnvlist_pack(nvlist_t *, size_t *);
      283 +void fnvlist_pack_free(char *, size_t);
      284 +nvlist_t *fnvlist_unpack(char *, size_t);
      285 +nvlist_t *fnvlist_dup(nvlist_t *);
      286 +void fnvlist_merge(nvlist_t *, nvlist_t *);
      287 +
      288 +void fnvlist_add_boolean(nvlist_t *, const char *);
      289 +void fnvlist_add_boolean_value(nvlist_t *, const char *, boolean_t);
      290 +void fnvlist_add_byte(nvlist_t *, const char *, uchar_t);
      291 +void fnvlist_add_int8(nvlist_t *, const char *, int8_t);
      292 +void fnvlist_add_uint8(nvlist_t *, const char *, uint8_t);
      293 +void fnvlist_add_int16(nvlist_t *, const char *, int16_t);
      294 +void fnvlist_add_uint16(nvlist_t *, const char *, uint16_t);
      295 +void fnvlist_add_int32(nvlist_t *, const char *, int32_t);
      296 +void fnvlist_add_uint32(nvlist_t *, const char *, uint32_t);
      297 +void fnvlist_add_int64(nvlist_t *, const char *, int64_t);
      298 +void fnvlist_add_uint64(nvlist_t *, const char *, uint64_t);
      299 +void fnvlist_add_string(nvlist_t *, const char *, const char *);
      300 +void fnvlist_add_nvlist(nvlist_t *, const char *, nvlist_t *);
      301 +void fnvlist_add_nvpair(nvlist_t *, nvpair_t *);
      302 +void fnvlist_add_boolean_array(nvlist_t *, const char *, boolean_t *, uint_t);
      303 +void fnvlist_add_byte_array(nvlist_t *, const char *, uchar_t *, uint_t);
      304 +void fnvlist_add_int8_array(nvlist_t *, const char *, int8_t *, uint_t);
      305 +void fnvlist_add_uint8_array(nvlist_t *, const char *, uint8_t *, uint_t);
      306 +void fnvlist_add_int16_array(nvlist_t *, const char *, int16_t *, uint_t);
      307 +void fnvlist_add_uint16_array(nvlist_t *, const char *, uint16_t *, uint_t);
      308 +void fnvlist_add_int32_array(nvlist_t *, const char *, int32_t *, uint_t);
      309 +void fnvlist_add_uint32_array(nvlist_t *, const char *, uint32_t *, uint_t);
      310 +void fnvlist_add_int64_array(nvlist_t *, const char *, int64_t *, uint_t);
      311 +void fnvlist_add_uint64_array(nvlist_t *, const char *, uint64_t *, uint_t);
      312 +void fnvlist_add_string_array(nvlist_t *, const char *, char * const *, uint_t);
      313 +void fnvlist_add_nvlist_array(nvlist_t *, const char *, nvlist_t **, uint_t);
      314 +
      315 +void fnvlist_remove(nvlist_t *, const char *);
      316 +void fnvlist_remove_nvpair(nvlist_t *, nvpair_t *);
      317 +
      318 +nvpair_t *fnvlist_lookup_nvpair(nvlist_t *nvl, const char *name);
      319 +boolean_t fnvlist_lookup_boolean(nvlist_t *nvl, const char *name);
      320 +boolean_t fnvlist_lookup_boolean_value(nvlist_t *nvl, const char *name);
      321 +uchar_t fnvlist_lookup_byte(nvlist_t *nvl, const char *name);
      322 +int8_t fnvlist_lookup_int8(nvlist_t *nvl, const char *name);
      323 +int16_t fnvlist_lookup_int16(nvlist_t *nvl, const char *name);
      324 +int32_t fnvlist_lookup_int32(nvlist_t *nvl, const char *name);
      325 +int64_t fnvlist_lookup_int64(nvlist_t *nvl, const char *name);
      326 +uint8_t fnvlist_lookup_uint8_t(nvlist_t *nvl, const char *name);
      327 +uint16_t fnvlist_lookup_uint16(nvlist_t *nvl, const char *name);
      328 +uint32_t fnvlist_lookup_uint32(nvlist_t *nvl, const char *name);
      329 +uint64_t fnvlist_lookup_uint64(nvlist_t *nvl, const char *name);
      330 +char *fnvlist_lookup_string(nvlist_t *nvl, const char *name);
      331 +nvlist_t *fnvlist_lookup_nvlist(nvlist_t *nvl, const char *name);
      332 +
      333 +boolean_t fnvpair_value_boolean_value(nvpair_t *nvp);
      334 +uchar_t fnvpair_value_byte(nvpair_t *nvp);
      335 +int8_t fnvpair_value_int8(nvpair_t *nvp);
      336 +int16_t fnvpair_value_int16(nvpair_t *nvp);
      337 +int32_t fnvpair_value_int32(nvpair_t *nvp);
      338 +int64_t fnvpair_value_int64(nvpair_t *nvp);
      339 +uint8_t fnvpair_value_uint8_t(nvpair_t *nvp);
      340 +uint16_t fnvpair_value_uint16(nvpair_t *nvp);
      341 +uint32_t fnvpair_value_uint32(nvpair_t *nvp);
      342 +uint64_t fnvpair_value_uint64(nvpair_t *nvp);
      343 +char *fnvpair_value_string(nvpair_t *nvp);
      344 +nvlist_t *fnvpair_value_nvlist(nvpair_t *nvp);
      345 +
 277  346  #ifdef  __cplusplus
 278  347  }
 279  348  #endif
 280  349  
 281  350  #endif  /* _SYS_NVPAIR_H */
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX