Print this page
    
usr/src/uts/common/fs/zfs/ddt.c
    
      
        | Split | 
	Close | 
      
      | Expand all | 
      | Collapse all | 
    
    
          --- old/usr/src/uts/common/fs/zfs/sys/dmu_objset.h
          +++ new/usr/src/uts/common/fs/zfs/sys/dmu_objset.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   *
  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
  
    | 
      ↓ open down ↓ | 
    16 lines elided | 
    
      ↑ open up ↑ | 
  
  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) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
  23   23   * Copyright (c) 2012, 2017 by Delphix. All rights reserved.
  24   24   * Copyright (c) 2013 by Saso Kiselkov. All rights reserved.
  25   25   * Copyright (c) 2014 Spectra Logic Corporation, All rights reserved.
  26   26   * Copyright (c) 2014 Integros [integros.com]
       27 + * Copyright 2016 Nexenta Systems, Inc.  All rights reserved.
  27   28   */
  28   29  
  29   30  /* Portions Copyright 2010 Robert Milkowski */
  30   31  
  31   32  #ifndef _SYS_DMU_OBJSET_H
  32   33  #define _SYS_DMU_OBJSET_H
  33   34  
  34   35  #include <sys/spa.h>
       36 +#include <sys/special_impl.h>
  35   37  #include <sys/arc.h>
  36   38  #include <sys/txg.h>
  37   39  #include <sys/zfs_context.h>
  38   40  #include <sys/dnode.h>
  39   41  #include <sys/zio.h>
  40   42  #include <sys/zil.h>
  41   43  #include <sys/sa.h>
       44 +#include <sys/zfs_ioctl.h>
  42   45  
  43   46  #ifdef  __cplusplus
  44   47  extern "C" {
  45   48  #endif
  46   49  
  47   50  extern krwlock_t os_lock;
  48   51  
  49   52  struct dsl_pool;
  50   53  struct dsl_dataset;
  51   54  struct dmu_tx;
  52   55  
  53   56  #define OBJSET_PHYS_SIZE 2048
  54   57  #define OBJSET_OLD_PHYS_SIZE 1024
  55   58  
  56   59  #define OBJSET_BUF_HAS_USERUSED(buf) \
  57   60          (arc_buf_size(buf) > OBJSET_OLD_PHYS_SIZE)
  58   61  
  59   62  #define OBJSET_FLAG_USERACCOUNTING_COMPLETE     (1ULL<<0)
  60   63  
  61   64  typedef struct objset_phys {
  
    | 
      ↓ open down ↓ | 
    10 lines elided | 
    
      ↑ open up ↑ | 
  
  62   65          dnode_phys_t os_meta_dnode;
  63   66          zil_header_t os_zil_header;
  64   67          uint64_t os_type;
  65   68          uint64_t os_flags;
  66   69          char os_pad[OBJSET_PHYS_SIZE - sizeof (dnode_phys_t)*3 -
  67   70              sizeof (zil_header_t) - sizeof (uint64_t)*2];
  68   71          dnode_phys_t os_userused_dnode;
  69   72          dnode_phys_t os_groupused_dnode;
  70   73  } objset_phys_t;
  71   74  
       75 +#define OBJSET_PROP_UNINITIALIZED       ((uint64_t)-1)
  72   76  struct objset {
  73   77          /* Immutable: */
  74   78          struct dsl_dataset *os_dsl_dataset;
  75   79          spa_t *os_spa;
  76   80          arc_buf_t *os_phys_buf;
  77   81          objset_phys_t *os_phys;
  78   82          /*
  79   83           * The following "special" dnodes have no parent, are exempt
  80   84           * from dnode_move(), and are not recorded in os_dnodes, but they
  81   85           * root their descendents in this objset using handles anyway, so
  82   86           * that all access to dnodes from dbufs consistently uses handles.
  83   87           */
  
    | 
      ↓ open down ↓ | 
    2 lines elided | 
    
      ↑ open up ↑ | 
  
  84   88          dnode_handle_t os_meta_dnode;
  85   89          dnode_handle_t os_userused_dnode;
  86   90          dnode_handle_t os_groupused_dnode;
  87   91          zilog_t *os_zil;
  88   92  
  89   93          list_node_t os_evicting_node;
  90   94  
  91   95          /* can change, under dsl_dir's locks: */
  92   96          enum zio_checksum os_checksum;
  93   97          enum zio_compress os_compress;
       98 +        boolean_t os_smartcomp_enabled;
  94   99          uint8_t os_copies;
  95  100          enum zio_checksum os_dedup_checksum;
  96  101          boolean_t os_dedup_verify;
  97  102          zfs_logbias_op_t os_logbias;
  98  103          zfs_cache_type_t os_primary_cache;
  99  104          zfs_cache_type_t os_secondary_cache;
 100  105          zfs_sync_type_t os_sync;
 101  106          zfs_redundant_metadata_type_t os_redundant_metadata;
 102  107          int os_recordsize;
      108 +        uint64_t os_zpl_meta_to_special;
      109 +        zfs_wbc_mode_t os_wbc_mode;
      110 +        uint64_t os_wbc_root_ds_obj;
      111 +        uint64_t os_wbc_off_txg;
      112 +        /*
      113 +         * The next four values are used as a cache of whatever's on disk, and
      114 +         * are initialized the first time these properties are queried. Before
      115 +         * being initialized with their real values, their values are
      116 +         * OBJSET_PROP_UNINITIALIZED.
      117 +         */
      118 +        uint64_t os_version;
      119 +        uint64_t os_normalization;
      120 +        uint64_t os_utf8only;
      121 +        uint64_t os_casesensitivity;
 103  122  
 104  123          /*
 105  124           * Pointer is constant; the blkptr it points to is protected by
 106  125           * os_dsl_dataset->ds_bp_rwlock
 107  126           */
 108  127          blkptr_t *os_rootbp;
 109  128  
 110  129          /* no lock needed: */
 111  130          struct dmu_tx *os_synctx; /* XXX sketchy */
 112  131          zil_header_t os_zil_header;
 113  132          multilist_t *os_synced_dnodes;
 114  133          uint64_t os_flags;
 115  134          uint64_t os_freed_dnodes;
 116  135          boolean_t os_rescan_dnodes;
 117  136  
 118  137          /* Protected by os_obj_lock */
 119  138          kmutex_t os_obj_lock;
 120  139          uint64_t os_obj_next;
 121  140  
 122  141          /* Protected by os_lock */
 123  142          kmutex_t os_lock;
 124  143          multilist_t *os_dirty_dnodes[TXG_SIZE];
 125  144          list_t os_dnodes;
 126  145          list_t os_downgraded_dbufs;
 127  146  
 128  147          /* Protects changes to DMU_{USER,GROUP}USED_OBJECT */
 129  148          kmutex_t os_userused_lock;
 130  149  
 131  150          /* stuff we store for the user */
 132  151          kmutex_t os_user_ptr_lock;
 133  152          void *os_user_ptr;
 134  153          sa_os_t *os_sa;
 135  154  };
  
    | 
      ↓ open down ↓ | 
    23 lines elided | 
    
      ↑ open up ↑ | 
  
 136  155  
 137  156  #define DMU_META_OBJSET         0
 138  157  #define DMU_META_DNODE_OBJECT   0
 139  158  #define DMU_OBJECT_IS_SPECIAL(obj) ((int64_t)(obj) <= 0)
 140  159  #define DMU_META_DNODE(os)      ((os)->os_meta_dnode.dnh_dnode)
 141  160  #define DMU_USERUSED_DNODE(os)  ((os)->os_userused_dnode.dnh_dnode)
 142  161  #define DMU_GROUPUSED_DNODE(os) ((os)->os_groupused_dnode.dnh_dnode)
 143  162  
 144  163  #define DMU_OS_IS_L2CACHEABLE(os)                               \
 145  164          ((os)->os_secondary_cache == ZFS_CACHE_ALL ||           \
 146      -        (os)->os_secondary_cache == ZFS_CACHE_METADATA)
      165 +        (os)->os_secondary_cache == ZFS_CACHE_METADATA ||       \
      166 +        (os)->os_secondary_cache == ZFS_CACHE_DATA)
 147  167  
 148  168  #define DMU_OS_IS_L2COMPRESSIBLE(os)    (zfs_mdcomp_disable == B_FALSE)
 149  169  
 150  170  /* called from zpl */
 151  171  int dmu_objset_hold(const char *name, void *tag, objset_t **osp);
 152  172  int dmu_objset_own(const char *name, dmu_objset_type_t type,
 153  173      boolean_t readonly, void *tag, objset_t **osp);
 154  174  int dmu_objset_own_obj(struct dsl_pool *dp, uint64_t obj,
 155  175      dmu_objset_type_t type, boolean_t readonly, void *tag, objset_t **osp);
 156  176  void dmu_objset_refresh_ownership(objset_t *os, void *tag);
 157  177  void dmu_objset_rele(objset_t *os, void *tag);
 158  178  void dmu_objset_disown(objset_t *os, void *tag);
 159  179  int dmu_objset_from_ds(struct dsl_dataset *ds, objset_t **osp);
 160  180  
 161  181  void dmu_objset_stats(objset_t *os, nvlist_t *nv);
 162  182  void dmu_objset_fast_stat(objset_t *os, dmu_objset_stats_t *stat);
 163  183  void dmu_objset_space(objset_t *os, uint64_t *refdbytesp, uint64_t *availbytesp,
 164  184      uint64_t *usedobjsp, uint64_t *availobjsp);
 165  185  uint64_t dmu_objset_fsid_guid(objset_t *os);
 166  186  int dmu_objset_find_dp(struct dsl_pool *dp, uint64_t ddobj,
 167  187      int func(struct dsl_pool *, struct dsl_dataset *, void *),
 168  188      void *arg, int flags);
 169  189  int dmu_objset_prefetch(const char *name, void *arg);
 170  190  void dmu_objset_evict_dbufs(objset_t *os);
 171  191  timestruc_t dmu_objset_snap_cmtime(objset_t *os);
 172  192  
 173  193  /* called from dsl */
 174  194  void dmu_objset_sync(objset_t *os, zio_t *zio, dmu_tx_t *tx);
 175  195  boolean_t dmu_objset_is_dirty(objset_t *os, uint64_t txg);
 176  196  objset_t *dmu_objset_create_impl(spa_t *spa, struct dsl_dataset *ds,
 177  197      blkptr_t *bp, dmu_objset_type_t type, dmu_tx_t *tx);
 178  198  int dmu_objset_open_impl(spa_t *spa, struct dsl_dataset *ds, blkptr_t *bp,
 179  199      objset_t **osp);
 180  200  void dmu_objset_evict(objset_t *os);
 181  201  void dmu_objset_do_userquota_updates(objset_t *os, dmu_tx_t *tx);
 182  202  void dmu_objset_userquota_get_ids(dnode_t *dn, boolean_t before, dmu_tx_t *tx);
 183  203  boolean_t dmu_objset_userused_enabled(objset_t *os);
 184  204  int dmu_objset_userspace_upgrade(objset_t *os);
 185  205  boolean_t dmu_objset_userspace_present(objset_t *os);
 186  206  int dmu_fsname(const char *snapname, char *buf);
 187  207  
 188  208  void dmu_objset_evict_done(objset_t *os);
 189  209  void dmu_objset_willuse_space(objset_t *os, int64_t space, dmu_tx_t *tx);
 190  210  
 191  211  void dmu_objset_init(void);
 192  212  void dmu_objset_fini(void);
 193  213  
 194  214  #ifdef  __cplusplus
 195  215  }
 196  216  #endif
 197  217  
 198  218  #endif /* _SYS_DMU_OBJSET_H */
  
    | 
      ↓ open down ↓ | 
    42 lines elided | 
    
      ↑ open up ↑ | 
  
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX