The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/contrib/openzfs/include/sys/dmu_objset.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*
    2  * CDDL HEADER START
    3  *
    4  * The contents of this file are subject to the terms of the
    5  * Common Development and Distribution License (the "License").
    6  * You may not use this file except in compliance with the License.
    7  *
    8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
    9  * or https://opensource.org/licenses/CDDL-1.0.
   10  * See the License for the specific language governing permissions
   11  * and limitations under the License.
   12  *
   13  * When distributing Covered Code, include this CDDL HEADER in each
   14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
   15  * If applicable, add the following below this CDDL HEADER, with the
   16  * fields enclosed by brackets "[]" replaced with your own identifying
   17  * information: Portions Copyright [yyyy] [name of copyright owner]
   18  *
   19  * CDDL HEADER END
   20  */
   21 /*
   22  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
   23  * Copyright (c) 2012, 2018 by Delphix. All rights reserved.
   24  * Copyright (c) 2013 by Saso Kiselkov. All rights reserved.
   25  * Copyright (c) 2014 Spectra Logic Corporation, All rights reserved.
   26  */
   27 
   28 /* Portions Copyright 2010 Robert Milkowski */
   29 
   30 #ifndef _SYS_DMU_OBJSET_H
   31 #define _SYS_DMU_OBJSET_H
   32 
   33 #include <sys/spa.h>
   34 #include <sys/arc.h>
   35 #include <sys/txg.h>
   36 #include <sys/zfs_context.h>
   37 #include <sys/dnode.h>
   38 #include <sys/zio.h>
   39 #include <sys/zil.h>
   40 #include <sys/sa.h>
   41 #include <sys/zfs_ioctl.h>
   42 
   43 #ifdef  __cplusplus
   44 extern "C" {
   45 #endif
   46 
   47 extern krwlock_t os_lock;
   48 
   49 struct dsl_pool;
   50 struct dsl_dataset;
   51 struct dmu_tx;
   52 
   53 #define OBJSET_PHYS_SIZE_V1     1024
   54 #define OBJSET_PHYS_SIZE_V2     2048
   55 #define OBJSET_PHYS_SIZE_V3     4096
   56 
   57 #define OBJSET_BUF_HAS_USERUSED(buf) \
   58         (arc_buf_size(buf) >= OBJSET_PHYS_SIZE_V2)
   59 #define OBJSET_BUF_HAS_PROJECTUSED(buf) \
   60         (arc_buf_size(buf) >= OBJSET_PHYS_SIZE_V3)
   61 
   62 #define OBJSET_FLAG_USERACCOUNTING_COMPLETE     (1ULL << 0)
   63 #define OBJSET_FLAG_USEROBJACCOUNTING_COMPLETE  (1ULL << 1)
   64 #define OBJSET_FLAG_PROJECTQUOTA_COMPLETE       (1ULL << 2)
   65 
   66 /*
   67  * This mask defines the set of flags which are "portable", meaning
   68  * that they can be preserved when doing a raw encrypted zfs send.
   69  * Flags included in this mask will be protected by os_portable_mac
   70  * when the block of dnodes is encrypted. No portable flags currently
   71  * exist.
   72  */
   73 #define OBJSET_CRYPT_PORTABLE_FLAGS_MASK        (0)
   74 
   75 typedef struct objset_phys {
   76         dnode_phys_t os_meta_dnode;
   77         zil_header_t os_zil_header;
   78         uint64_t os_type;
   79         uint64_t os_flags;
   80         uint8_t os_portable_mac[ZIO_OBJSET_MAC_LEN];
   81         uint8_t os_local_mac[ZIO_OBJSET_MAC_LEN];
   82         char os_pad0[OBJSET_PHYS_SIZE_V2 - sizeof (dnode_phys_t)*3 -
   83             sizeof (zil_header_t) - sizeof (uint64_t)*2 -
   84             2*ZIO_OBJSET_MAC_LEN];
   85         dnode_phys_t os_userused_dnode;
   86         dnode_phys_t os_groupused_dnode;
   87         dnode_phys_t os_projectused_dnode;
   88         char os_pad1[OBJSET_PHYS_SIZE_V3 - OBJSET_PHYS_SIZE_V2 -
   89             sizeof (dnode_phys_t)];
   90 } objset_phys_t;
   91 
   92 typedef int (*dmu_objset_upgrade_cb_t)(objset_t *);
   93 
   94 #define OBJSET_PROP_UNINITIALIZED       ((uint64_t)-1)
   95 struct objset {
   96         /* Immutable: */
   97         struct dsl_dataset *os_dsl_dataset;
   98         spa_t *os_spa;
   99         arc_buf_t *os_phys_buf;
  100         objset_phys_t *os_phys;
  101         boolean_t os_encrypted;
  102 
  103         /*
  104          * The following "special" dnodes have no parent, are exempt
  105          * from dnode_move(), and are not recorded in os_dnodes, but they
  106          * root their descendents in this objset using handles anyway, so
  107          * that all access to dnodes from dbufs consistently uses handles.
  108          */
  109         dnode_handle_t os_meta_dnode;
  110         dnode_handle_t os_userused_dnode;
  111         dnode_handle_t os_groupused_dnode;
  112         dnode_handle_t os_projectused_dnode;
  113         zilog_t *os_zil;
  114 
  115         list_node_t os_evicting_node;
  116 
  117         /* can change, under dsl_dir's locks: */
  118         uint64_t os_dnodesize; /* default dnode size for new objects */
  119         enum zio_checksum os_checksum;
  120         enum zio_compress os_compress;
  121         uint8_t os_complevel;
  122         uint8_t os_copies;
  123         enum zio_checksum os_dedup_checksum;
  124         boolean_t os_dedup_verify;
  125         zfs_logbias_op_t os_logbias;
  126         zfs_cache_type_t os_primary_cache;
  127         zfs_cache_type_t os_secondary_cache;
  128         zfs_sync_type_t os_sync;
  129         zfs_redundant_metadata_type_t os_redundant_metadata;
  130         uint64_t os_recordsize;
  131         /*
  132          * The next four values are used as a cache of whatever's on disk, and
  133          * are initialized the first time these properties are queried. Before
  134          * being initialized with their real values, their values are
  135          * OBJSET_PROP_UNINITIALIZED.
  136          */
  137         uint64_t os_version;
  138         uint64_t os_normalization;
  139         uint64_t os_utf8only;
  140         uint64_t os_casesensitivity;
  141         /*
  142          * The largest zpl file block allowed in special class.
  143          * cached here instead of zfsvfs for easier access.
  144          */
  145         int os_zpl_special_smallblock;
  146 
  147         /*
  148          * Pointer is constant; the blkptr it points to is protected by
  149          * os_dsl_dataset->ds_bp_rwlock
  150          */
  151         blkptr_t *os_rootbp;
  152 
  153         /* no lock needed: */
  154         struct dmu_tx *os_synctx; /* XXX sketchy */
  155         zil_header_t os_zil_header;
  156         multilist_t os_synced_dnodes;
  157         uint64_t os_flags;
  158         uint64_t os_freed_dnodes;
  159         boolean_t os_rescan_dnodes;
  160         boolean_t os_raw_receive;
  161 
  162         /* os_phys_buf should be written raw next txg */
  163         boolean_t os_next_write_raw[TXG_SIZE];
  164 
  165         /* Protected by os_obj_lock */
  166         kmutex_t os_obj_lock;
  167         uint64_t os_obj_next_chunk;
  168 
  169         /* Per-CPU next object to allocate, protected by atomic ops. */
  170         uint64_t *os_obj_next_percpu;
  171         int os_obj_next_percpu_len;
  172 
  173         /* Protected by os_lock */
  174         kmutex_t os_lock;
  175         multilist_t os_dirty_dnodes[TXG_SIZE];
  176         list_t os_dnodes;
  177         list_t os_downgraded_dbufs;
  178 
  179         /* Protects changes to DMU_{USER,GROUP,PROJECT}USED_OBJECT */
  180         kmutex_t os_userused_lock;
  181 
  182         /* stuff we store for the user */
  183         kmutex_t os_user_ptr_lock;
  184         void *os_user_ptr;
  185         sa_os_t *os_sa;
  186 
  187         /* kernel thread to upgrade this dataset */
  188         kmutex_t os_upgrade_lock;
  189         taskqid_t os_upgrade_id;
  190         dmu_objset_upgrade_cb_t os_upgrade_cb;
  191         boolean_t os_upgrade_exit;
  192         int os_upgrade_status;
  193 };
  194 
  195 #define DMU_META_OBJSET         0
  196 #define DMU_META_DNODE_OBJECT   0
  197 #define DMU_OBJECT_IS_SPECIAL(obj) ((int64_t)(obj) <= 0)
  198 #define DMU_META_DNODE(os)      ((os)->os_meta_dnode.dnh_dnode)
  199 #define DMU_USERUSED_DNODE(os)  ((os)->os_userused_dnode.dnh_dnode)
  200 #define DMU_GROUPUSED_DNODE(os) ((os)->os_groupused_dnode.dnh_dnode)
  201 #define DMU_PROJECTUSED_DNODE(os) ((os)->os_projectused_dnode.dnh_dnode)
  202 
  203 /* called from zpl */
  204 int dmu_objset_hold(const char *name, const void *tag, objset_t **osp);
  205 int dmu_objset_hold_flags(const char *name, boolean_t decrypt, const void *tag,
  206     objset_t **osp);
  207 int dmu_objset_own(const char *name, dmu_objset_type_t type,
  208     boolean_t readonly, boolean_t decrypt, const void *tag, objset_t **osp);
  209 int dmu_objset_own_obj(struct dsl_pool *dp, uint64_t obj,
  210     dmu_objset_type_t type, boolean_t readonly, boolean_t decrypt,
  211     const void *tag, objset_t **osp);
  212 void dmu_objset_refresh_ownership(struct dsl_dataset *ds,
  213     struct dsl_dataset **newds, boolean_t decrypt, const void *tag);
  214 void dmu_objset_rele(objset_t *os, const void *tag);
  215 void dmu_objset_rele_flags(objset_t *os, boolean_t decrypt, const void *tag);
  216 void dmu_objset_disown(objset_t *os, boolean_t decrypt, const void *tag);
  217 int dmu_objset_from_ds(struct dsl_dataset *ds, objset_t **osp);
  218 
  219 void dmu_objset_stats(objset_t *os, nvlist_t *nv);
  220 void dmu_objset_fast_stat(objset_t *os, dmu_objset_stats_t *stat);
  221 void dmu_objset_space(objset_t *os, uint64_t *refdbytesp, uint64_t *availbytesp,
  222     uint64_t *usedobjsp, uint64_t *availobjsp);
  223 uint64_t dmu_objset_fsid_guid(objset_t *os);
  224 int dmu_objset_find_dp(struct dsl_pool *dp, uint64_t ddobj,
  225     int func(struct dsl_pool *, struct dsl_dataset *, void *),
  226     void *arg, int flags);
  227 void dmu_objset_evict_dbufs(objset_t *os);
  228 inode_timespec_t dmu_objset_snap_cmtime(objset_t *os);
  229 
  230 /* called from dsl */
  231 void dmu_objset_sync(objset_t *os, zio_t *zio, dmu_tx_t *tx);
  232 boolean_t dmu_objset_is_dirty(objset_t *os, uint64_t txg);
  233 objset_t *dmu_objset_create_impl_dnstats(spa_t *spa, struct dsl_dataset *ds,
  234     blkptr_t *bp, dmu_objset_type_t type, int levels, int blksz, int ibs,
  235     dmu_tx_t *tx);
  236 objset_t *dmu_objset_create_impl(spa_t *spa, struct dsl_dataset *ds,
  237     blkptr_t *bp, dmu_objset_type_t type, dmu_tx_t *tx);
  238 int dmu_objset_open_impl(spa_t *spa, struct dsl_dataset *ds, blkptr_t *bp,
  239     objset_t **osp);
  240 void dmu_objset_evict(objset_t *os);
  241 void dmu_objset_sync_done(objset_t *os, dmu_tx_t *tx);
  242 void dmu_objset_userquota_get_ids(dnode_t *dn, boolean_t before, dmu_tx_t *tx);
  243 boolean_t dmu_objset_userused_enabled(objset_t *os);
  244 void dmu_objset_userspace_upgrade(objset_t *os);
  245 boolean_t dmu_objset_userspace_present(objset_t *os);
  246 boolean_t dmu_objset_userobjused_enabled(objset_t *os);
  247 boolean_t dmu_objset_userobjspace_upgradable(objset_t *os);
  248 boolean_t dmu_objset_userobjspace_present(objset_t *os);
  249 boolean_t dmu_objset_incompatible_encryption_version(objset_t *os);
  250 boolean_t dmu_objset_projectquota_enabled(objset_t *os);
  251 boolean_t dmu_objset_projectquota_present(objset_t *os);
  252 boolean_t dmu_objset_projectquota_upgradable(objset_t *os);
  253 void dmu_objset_id_quota_upgrade(objset_t *os);
  254 int dmu_get_file_info(objset_t *os, dmu_object_type_t bonustype,
  255     const void *data, zfs_file_info_t *zfi);
  256 
  257 int dmu_fsname(const char *snapname, char *buf);
  258 
  259 void dmu_objset_evict_done(objset_t *os);
  260 void dmu_objset_willuse_space(objset_t *os, int64_t space, dmu_tx_t *tx);
  261 
  262 void dmu_objset_init(void);
  263 void dmu_objset_fini(void);
  264 
  265 #ifdef  __cplusplus
  266 }
  267 #endif
  268 
  269 #endif /* _SYS_DMU_OBJSET_H */

Cache object: eedba064e5931a7e53ca8e6dcfae83ea


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.