fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER START
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The contents of this file are subject to the terms of the
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * Common Development and Distribution License (the "License").
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * You may not use this file except in compliance with the License.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
fa9e4066f08beec538e775443c5be79dd423fcabahrens * or http://www.opensolaris.org/os/licensing.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * See the License for the specific language governing permissions
fa9e4066f08beec538e775443c5be79dd423fcabahrens * and limitations under the License.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * When distributing Covered Code, include this CDDL HEADER in each
fa9e4066f08beec538e775443c5be79dd423fcabahrens * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If applicable, add the following below this CDDL HEADER, with the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * fields enclosed by brackets "[]" replaced with your own identifying
fa9e4066f08beec538e775443c5be79dd423fcabahrens * information: Portions Copyright [yyyy] [name of copyright owner]
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER END
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Use is subject to license terms.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
3b2aab18808792cbd248a12f1edf139b89833c13Matthew Ahrens/*
0c779ad424a92a84d1e07d47cab7f8009189202bMatthew Ahrens * Copyright (c) 2012, 2015 by Delphix. All rights reserved.
3b2aab18808792cbd248a12f1edf139b89833c13Matthew Ahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifndef _SYS_DMU_TX_H
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define _SYS_DMU_TX_H
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/inttypes.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/dmu.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/txg.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/refcount.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef __cplusplus
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern "C" {
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstruct dmu_buf_impl;
8a2f1b9190d1dc288470a1fd2776d79ce82cb129ahrensstruct dmu_tx_hold;
fa9e4066f08beec538e775443c5be79dd423fcabahrensstruct dnode_link;
fa9e4066f08beec538e775443c5be79dd423fcabahrensstruct dsl_pool;
fa9e4066f08beec538e775443c5be79dd423fcabahrensstruct dnode;
fa9e4066f08beec538e775443c5be79dd423fcabahrensstruct dsl_dir;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstruct dmu_tx {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * No synchronization is needed because a tx can only be handled
fa9e4066f08beec538e775443c5be79dd423fcabahrens * by one thread.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens list_t tx_holds; /* list of dmu_tx_hold_t */
fa9e4066f08beec538e775443c5be79dd423fcabahrens objset_t *tx_objset;
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct dsl_dir *tx_dir;
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct dsl_pool *tx_pool;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint64_t tx_txg;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock uint64_t tx_lastsnap_txg;
8a2f1b9190d1dc288470a1fd2776d79ce82cb129ahrens uint64_t tx_lasttried_txg;
fa9e4066f08beec538e775443c5be79dd423fcabahrens txg_handle_t tx_txgh;
fa9e4066f08beec538e775443c5be79dd423fcabahrens void *tx_tempreserve_cookie;
8a2f1b9190d1dc288470a1fd2776d79ce82cb129ahrens struct dmu_tx_hold *tx_needassign_txh;
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens /* list of dmu_tx_callback_t on this dmu_tx */
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens list_t tx_callbacks;
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens /* placeholder for syncing context, doesn't need specific holds */
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens boolean_t tx_anyobj;
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens /* has this transaction already been delayed? */
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens boolean_t tx_waited;
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens /* time this transaction was created */
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens hrtime_t tx_start;
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens /* need to wait for sufficient dirty space */
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens boolean_t tx_wait_dirty;
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock int tx_err;
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef ZFS_DEBUG
8a2f1b9190d1dc288470a1fd2776d79ce82cb129ahrens uint64_t tx_space_towrite;
8a2f1b9190d1dc288470a1fd2776d79ce82cb129ahrens uint64_t tx_space_tofree;
8a2f1b9190d1dc288470a1fd2776d79ce82cb129ahrens uint64_t tx_space_tooverwrite;
a9799022bd90b13722204e80112efaa5bf573099ck uint64_t tx_space_tounref;
8a2f1b9190d1dc288470a1fd2776d79ce82cb129ahrens refcount_t tx_space_written;
8a2f1b9190d1dc288470a1fd2776d79ce82cb129ahrens refcount_t tx_space_freed;
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens};
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensenum dmu_tx_hold_type {
fa9e4066f08beec538e775443c5be79dd423fcabahrens THT_NEWOBJECT,
fa9e4066f08beec538e775443c5be79dd423fcabahrens THT_WRITE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens THT_BONUS,
fa9e4066f08beec538e775443c5be79dd423fcabahrens THT_FREE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens THT_ZAP,
fa9e4066f08beec538e775443c5be79dd423fcabahrens THT_SPACE,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum THT_SPILL,
fa9e4066f08beec538e775443c5be79dd423fcabahrens THT_NUMTYPES
fa9e4066f08beec538e775443c5be79dd423fcabahrens};
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct dmu_tx_hold {
8a2f1b9190d1dc288470a1fd2776d79ce82cb129ahrens dmu_tx_t *txh_tx;
8a2f1b9190d1dc288470a1fd2776d79ce82cb129ahrens list_node_t txh_node;
8a2f1b9190d1dc288470a1fd2776d79ce82cb129ahrens struct dnode *txh_dnode;
0c779ad424a92a84d1e07d47cab7f8009189202bMatthew Ahrens refcount_t txh_space_towrite;
0c779ad424a92a84d1e07d47cab7f8009189202bMatthew Ahrens refcount_t txh_space_tofree;
0c779ad424a92a84d1e07d47cab7f8009189202bMatthew Ahrens refcount_t txh_space_tooverwrite;
0c779ad424a92a84d1e07d47cab7f8009189202bMatthew Ahrens refcount_t txh_space_tounref;
0c779ad424a92a84d1e07d47cab7f8009189202bMatthew Ahrens refcount_t txh_memory_tohold;
0c779ad424a92a84d1e07d47cab7f8009189202bMatthew Ahrens refcount_t txh_fudge;
8a2f1b9190d1dc288470a1fd2776d79ce82cb129ahrens#ifdef ZFS_DEBUG
8a2f1b9190d1dc288470a1fd2776d79ce82cb129ahrens enum dmu_tx_hold_type txh_type;
8a2f1b9190d1dc288470a1fd2776d79ce82cb129ahrens uint64_t txh_arg1;
8a2f1b9190d1dc288470a1fd2776d79ce82cb129ahrens uint64_t txh_arg2;
8a2f1b9190d1dc288470a1fd2776d79ce82cb129ahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens} dmu_tx_hold_t;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
d20e665c84abf083a9e8b62cca93383ecb55afdfRicardo M. Correiatypedef struct dmu_tx_callback {
d20e665c84abf083a9e8b62cca93383ecb55afdfRicardo M. Correia list_node_t dcb_node; /* linked to tx_callbacks list */
d20e665c84abf083a9e8b62cca93383ecb55afdfRicardo M. Correia dmu_tx_callback_func_t *dcb_func; /* caller function pointer */
d20e665c84abf083a9e8b62cca93383ecb55afdfRicardo M. Correia void *dcb_data; /* caller private data */
d20e665c84abf083a9e8b62cca93383ecb55afdfRicardo M. Correia} dmu_tx_callback_t;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * These routines are defined in dmu.h, and are called by the user.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensdmu_tx_t *dmu_tx_create(objset_t *dd);
3b2aab18808792cbd248a12f1edf139b89833c13Matthew Ahrensint dmu_tx_assign(dmu_tx_t *tx, txg_how_t txg_how);
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid dmu_tx_commit(dmu_tx_t *tx);
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid dmu_tx_abort(dmu_tx_t *tx);
fa9e4066f08beec538e775443c5be79dd423fcabahrensuint64_t dmu_tx_get_txg(dmu_tx_t *tx);
3b2aab18808792cbd248a12f1edf139b89833c13Matthew Ahrensstruct dsl_pool *dmu_tx_pool(dmu_tx_t *tx);
8a2f1b9190d1dc288470a1fd2776d79ce82cb129ahrensvoid dmu_tx_wait(dmu_tx_t *tx);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
d20e665c84abf083a9e8b62cca93383ecb55afdfRicardo M. Correiavoid dmu_tx_callback_register(dmu_tx_t *tx, dmu_tx_callback_func_t *dcb_func,
d20e665c84abf083a9e8b62cca93383ecb55afdfRicardo M. Correia void *dcb_data);
d20e665c84abf083a9e8b62cca93383ecb55afdfRicardo M. Correiavoid dmu_tx_do_callbacks(list_t *cb_list, int error);
d20e665c84abf083a9e8b62cca93383ecb55afdfRicardo M. Correia
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * These routines are defined in dmu_spa.h, and are called by the SPA.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern dmu_tx_t *dmu_tx_create_assigned(struct dsl_pool *dp, uint64_t txg);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * These routines are only called by the DMU.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
1d452cf5123cb6ac0a013a4dbd4dcceeb0da314dahrensdmu_tx_t *dmu_tx_create_dd(dsl_dir_t *dd);
fa9e4066f08beec538e775443c5be79dd423fcabahrensint dmu_tx_is_syncing(dmu_tx_t *tx);
fa9e4066f08beec538e775443c5be79dd423fcabahrensint dmu_tx_private_ok(dmu_tx_t *tx);
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid dmu_tx_add_new_object(dmu_tx_t *tx, objset_t *os, uint64_t object);
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid dmu_tx_willuse_space(dmu_tx_t *tx, int64_t delta);
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid dmu_tx_dirty_buf(dmu_tx_t *tx, struct dmu_buf_impl *db);
fa9e4066f08beec538e775443c5be79dd423fcabahrensint dmu_tx_holds(dmu_tx_t *tx, uint64_t object);
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid dmu_tx_hold_space(dmu_tx_t *tx, uint64_t space);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef ZFS_DEBUG
9c9dc39aa72ac40bb2558d54adfa596d217135d9ek#define DMU_TX_DIRTY_BUF(tx, db) dmu_tx_dirty_buf(tx, db)
fa9e4066f08beec538e775443c5be79dd423fcabahrens#else
9c9dc39aa72ac40bb2558d54adfa596d217135d9ek#define DMU_TX_DIRTY_BUF(tx, db)
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef __cplusplus
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif /* _SYS_DMU_TX_H */