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_tx.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 2010 Sun Microsystems, Inc.  All rights reserved.
   23  * Use is subject to license terms.
   24  */
   25 /*
   26  * Copyright (c) 2012, 2016 by Delphix. All rights reserved.
   27  */
   28 
   29 #ifndef _SYS_DMU_TX_H
   30 #define _SYS_DMU_TX_H
   31 
   32 #include <sys/inttypes.h>
   33 #include <sys/dmu.h>
   34 #include <sys/txg.h>
   35 #include <sys/zfs_refcount.h>
   36 
   37 #ifdef  __cplusplus
   38 extern "C" {
   39 #endif
   40 
   41 struct dmu_buf_impl;
   42 struct dmu_tx_hold;
   43 struct dnode_link;
   44 struct dsl_pool;
   45 struct dnode;
   46 struct dsl_dir;
   47 
   48 struct dmu_tx {
   49         /*
   50          * No synchronization is needed because a tx can only be handled
   51          * by one thread.
   52          */
   53         list_t tx_holds; /* list of dmu_tx_hold_t */
   54         objset_t *tx_objset;
   55         struct dsl_dir *tx_dir;
   56         struct dsl_pool *tx_pool;
   57         uint64_t tx_txg;
   58         uint64_t tx_lastsnap_txg;
   59         uint64_t tx_lasttried_txg;
   60         txg_handle_t tx_txgh;
   61         void *tx_tempreserve_cookie;
   62         struct dmu_tx_hold *tx_needassign_txh;
   63 
   64         /* list of dmu_tx_callback_t on this dmu_tx */
   65         list_t tx_callbacks;
   66 
   67         /* placeholder for syncing context, doesn't need specific holds */
   68         boolean_t tx_anyobj;
   69 
   70         /* transaction is marked as being a "net free" of space */
   71         boolean_t tx_netfree;
   72 
   73         /* time this transaction was created */
   74         hrtime_t tx_start;
   75 
   76         /* need to wait for sufficient dirty space */
   77         boolean_t tx_wait_dirty;
   78 
   79         /* has this transaction already been delayed? */
   80         boolean_t tx_dirty_delayed;
   81 
   82         int tx_err;
   83 };
   84 
   85 enum dmu_tx_hold_type {
   86         THT_NEWOBJECT,
   87         THT_WRITE,
   88         THT_BONUS,
   89         THT_FREE,
   90         THT_ZAP,
   91         THT_SPACE,
   92         THT_SPILL,
   93         THT_NUMTYPES
   94 };
   95 
   96 typedef struct dmu_tx_hold {
   97         dmu_tx_t *txh_tx;
   98         list_node_t txh_node;
   99         struct dnode *txh_dnode;
  100         zfs_refcount_t txh_space_towrite;
  101         zfs_refcount_t txh_memory_tohold;
  102         enum dmu_tx_hold_type txh_type;
  103         uint64_t txh_arg1;
  104         uint64_t txh_arg2;
  105 } dmu_tx_hold_t;
  106 
  107 typedef struct dmu_tx_callback {
  108         list_node_t             dcb_node;    /* linked to tx_callbacks list */
  109         dmu_tx_callback_func_t  *dcb_func;   /* caller function pointer */
  110         void                    *dcb_data;   /* caller private data */
  111 } dmu_tx_callback_t;
  112 
  113 /*
  114  * Used for dmu tx kstat.
  115  */
  116 typedef struct dmu_tx_stats {
  117         kstat_named_t dmu_tx_assigned;
  118         kstat_named_t dmu_tx_delay;
  119         kstat_named_t dmu_tx_error;
  120         kstat_named_t dmu_tx_suspended;
  121         kstat_named_t dmu_tx_group;
  122         kstat_named_t dmu_tx_memory_reserve;
  123         kstat_named_t dmu_tx_memory_reclaim;
  124         kstat_named_t dmu_tx_dirty_throttle;
  125         kstat_named_t dmu_tx_dirty_delay;
  126         kstat_named_t dmu_tx_dirty_over_max;
  127         kstat_named_t dmu_tx_dirty_frees_delay;
  128         kstat_named_t dmu_tx_wrlog_delay;
  129         kstat_named_t dmu_tx_quota;
  130 } dmu_tx_stats_t;
  131 
  132 extern dmu_tx_stats_t dmu_tx_stats;
  133 
  134 #define DMU_TX_STAT_INCR(stat, val) \
  135     atomic_add_64(&dmu_tx_stats.stat.value.ui64, (val));
  136 #define DMU_TX_STAT_BUMP(stat) \
  137     DMU_TX_STAT_INCR(stat, 1);
  138 
  139 /*
  140  * These routines are defined in dmu.h, and are called by the user.
  141  */
  142 dmu_tx_t *dmu_tx_create(objset_t *dd);
  143 int dmu_tx_assign(dmu_tx_t *tx, uint64_t txg_how);
  144 void dmu_tx_commit(dmu_tx_t *tx);
  145 void dmu_tx_abort(dmu_tx_t *tx);
  146 uint64_t dmu_tx_get_txg(dmu_tx_t *tx);
  147 struct dsl_pool *dmu_tx_pool(dmu_tx_t *tx);
  148 void dmu_tx_wait(dmu_tx_t *tx);
  149 
  150 /*
  151  * These routines are defined in dmu_spa.h, and are called by the SPA.
  152  */
  153 extern dmu_tx_t *dmu_tx_create_assigned(struct dsl_pool *dp, uint64_t txg);
  154 
  155 /*
  156  * These routines are only called by the DMU.
  157  */
  158 dmu_tx_t *dmu_tx_create_dd(dsl_dir_t *dd);
  159 int dmu_tx_is_syncing(dmu_tx_t *tx);
  160 int dmu_tx_private_ok(dmu_tx_t *tx);
  161 void dmu_tx_add_new_object(dmu_tx_t *tx, dnode_t *dn);
  162 void dmu_tx_dirty_buf(dmu_tx_t *tx, struct dmu_buf_impl *db);
  163 void dmu_tx_hold_space(dmu_tx_t *tx, uint64_t space);
  164 
  165 #ifdef ZFS_DEBUG
  166 #define DMU_TX_DIRTY_BUF(tx, db)        dmu_tx_dirty_buf(tx, db)
  167 #else
  168 #define DMU_TX_DIRTY_BUF(tx, db)
  169 #endif
  170 
  171 void dmu_tx_init(void);
  172 void dmu_tx_fini(void);
  173 
  174 #ifdef  __cplusplus
  175 }
  176 #endif
  177 
  178 #endif  /* _SYS_DMU_TX_H */

Cache object: 71bddeab9082bc88d0ab6ed9ff52d3f8


[ 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.