]>
Commit | Line | Data |
---|---|---|
34dc7c2f BB |
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 http://www.opensolaris.org/os/licensing. | |
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 | /* | |
428870ff | 22 | * Copyright 2010 Sun Microsystems, Inc. All rights reserved. |
34dc7c2f BB |
23 | * Use is subject to license terms. |
24 | */ | |
25 | ||
26 | #ifndef _SYS_DMU_TX_H | |
27 | #define _SYS_DMU_TX_H | |
28 | ||
34dc7c2f BB |
29 | #include <sys/inttypes.h> |
30 | #include <sys/dmu.h> | |
31 | #include <sys/txg.h> | |
32 | #include <sys/refcount.h> | |
33 | ||
34 | #ifdef __cplusplus | |
35 | extern "C" { | |
36 | #endif | |
37 | ||
38 | struct dmu_buf_impl; | |
39 | struct dmu_tx_hold; | |
40 | struct dnode_link; | |
41 | struct dsl_pool; | |
42 | struct dnode; | |
43 | struct dsl_dir; | |
44 | ||
45 | struct dmu_tx { | |
46 | /* | |
47 | * No synchronization is needed because a tx can only be handled | |
48 | * by one thread. | |
49 | */ | |
50 | list_t tx_holds; /* list of dmu_tx_hold_t */ | |
51 | objset_t *tx_objset; | |
52 | struct dsl_dir *tx_dir; | |
53 | struct dsl_pool *tx_pool; | |
54 | uint64_t tx_txg; | |
55 | uint64_t tx_lastsnap_txg; | |
56 | uint64_t tx_lasttried_txg; | |
57 | txg_handle_t tx_txgh; | |
58 | void *tx_tempreserve_cookie; | |
59 | struct dmu_tx_hold *tx_needassign_txh; | |
428870ff | 60 | list_t tx_callbacks; /* list of dmu_tx_callback_t on this dmu_tx */ |
34dc7c2f BB |
61 | uint8_t tx_anyobj; |
62 | int tx_err; | |
63 | #ifdef ZFS_DEBUG | |
64 | uint64_t tx_space_towrite; | |
65 | uint64_t tx_space_tofree; | |
66 | uint64_t tx_space_tooverwrite; | |
67 | uint64_t tx_space_tounref; | |
68 | refcount_t tx_space_written; | |
69 | refcount_t tx_space_freed; | |
70 | #endif | |
71 | }; | |
72 | ||
73 | enum dmu_tx_hold_type { | |
74 | THT_NEWOBJECT, | |
75 | THT_WRITE, | |
76 | THT_BONUS, | |
77 | THT_FREE, | |
78 | THT_ZAP, | |
79 | THT_SPACE, | |
428870ff | 80 | THT_SPILL, |
34dc7c2f BB |
81 | THT_NUMTYPES |
82 | }; | |
83 | ||
84 | typedef struct dmu_tx_hold { | |
85 | dmu_tx_t *txh_tx; | |
86 | list_node_t txh_node; | |
87 | struct dnode *txh_dnode; | |
88 | uint64_t txh_space_towrite; | |
89 | uint64_t txh_space_tofree; | |
90 | uint64_t txh_space_tooverwrite; | |
91 | uint64_t txh_space_tounref; | |
b128c09f BB |
92 | uint64_t txh_memory_tohold; |
93 | uint64_t txh_fudge; | |
34dc7c2f BB |
94 | #ifdef ZFS_DEBUG |
95 | enum dmu_tx_hold_type txh_type; | |
96 | uint64_t txh_arg1; | |
97 | uint64_t txh_arg2; | |
98 | #endif | |
99 | } dmu_tx_hold_t; | |
100 | ||
428870ff BB |
101 | typedef struct dmu_tx_callback { |
102 | list_node_t dcb_node; /* linked to tx_callbacks list */ | |
103 | dmu_tx_callback_func_t *dcb_func; /* caller function pointer */ | |
104 | void *dcb_data; /* caller private data */ | |
105 | } dmu_tx_callback_t; | |
34dc7c2f BB |
106 | |
107 | /* | |
108 | * These routines are defined in dmu.h, and are called by the user. | |
109 | */ | |
110 | dmu_tx_t *dmu_tx_create(objset_t *dd); | |
111 | int dmu_tx_assign(dmu_tx_t *tx, uint64_t txg_how); | |
112 | void dmu_tx_commit(dmu_tx_t *tx); | |
113 | void dmu_tx_abort(dmu_tx_t *tx); | |
114 | uint64_t dmu_tx_get_txg(dmu_tx_t *tx); | |
115 | void dmu_tx_wait(dmu_tx_t *tx); | |
116 | ||
428870ff BB |
117 | void dmu_tx_callback_register(dmu_tx_t *tx, dmu_tx_callback_func_t *dcb_func, |
118 | void *dcb_data); | |
119 | void dmu_tx_do_callbacks(list_t *cb_list, int error); | |
120 | ||
34dc7c2f BB |
121 | /* |
122 | * These routines are defined in dmu_spa.h, and are called by the SPA. | |
123 | */ | |
124 | extern dmu_tx_t *dmu_tx_create_assigned(struct dsl_pool *dp, uint64_t txg); | |
125 | ||
126 | /* | |
127 | * These routines are only called by the DMU. | |
128 | */ | |
129 | dmu_tx_t *dmu_tx_create_dd(dsl_dir_t *dd); | |
130 | int dmu_tx_is_syncing(dmu_tx_t *tx); | |
131 | int dmu_tx_private_ok(dmu_tx_t *tx); | |
132 | void dmu_tx_add_new_object(dmu_tx_t *tx, objset_t *os, uint64_t object); | |
133 | void dmu_tx_willuse_space(dmu_tx_t *tx, int64_t delta); | |
134 | void dmu_tx_dirty_buf(dmu_tx_t *tx, struct dmu_buf_impl *db); | |
135 | int dmu_tx_holds(dmu_tx_t *tx, uint64_t object); | |
136 | void dmu_tx_hold_space(dmu_tx_t *tx, uint64_t space); | |
137 | ||
138 | #ifdef ZFS_DEBUG | |
139 | #define DMU_TX_DIRTY_BUF(tx, db) dmu_tx_dirty_buf(tx, db) | |
140 | #else | |
141 | #define DMU_TX_DIRTY_BUF(tx, db) | |
142 | #endif | |
143 | ||
144 | #ifdef __cplusplus | |
145 | } | |
146 | #endif | |
147 | ||
148 | #endif /* _SYS_DMU_TX_H */ |