Branch data Line data Source code
1 : : /*
2 : : * Copyright (C) 2007 Oracle. All rights reserved.
3 : : *
4 : : * This program is free software; you can redistribute it and/or
5 : : * modify it under the terms of the GNU General Public
6 : : * License v2 as published by the Free Software Foundation.
7 : : *
8 : : * This program is distributed in the hope that it will be useful,
9 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 : : * General Public License for more details.
12 : : *
13 : : * You should have received a copy of the GNU General Public
14 : : * License along with this program; if not, write to the
15 : : * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
16 : : * Boston, MA 021110-1307, USA.
17 : : */
18 : :
19 : : #ifndef __BTRFS_TRANSACTION__
20 : : #define __BTRFS_TRANSACTION__
21 : : #include "btrfs_inode.h"
22 : : #include "delayed-ref.h"
23 : : #include "ctree.h"
24 : :
25 : : enum btrfs_trans_state {
26 : : TRANS_STATE_RUNNING = 0,
27 : : TRANS_STATE_BLOCKED = 1,
28 : : TRANS_STATE_COMMIT_START = 2,
29 : : TRANS_STATE_COMMIT_DOING = 3,
30 : : TRANS_STATE_UNBLOCKED = 4,
31 : : TRANS_STATE_COMPLETED = 5,
32 : : TRANS_STATE_MAX = 6,
33 : : };
34 : :
35 : : struct btrfs_transaction {
36 : : u64 transid;
37 : : /*
38 : : * total external writers(USERSPACE/START/ATTACH) in this
39 : : * transaction, it must be zero before the transaction is
40 : : * being committed
41 : : */
42 : : atomic_t num_extwriters;
43 : : /*
44 : : * total writers in this transaction, it must be zero before the
45 : : * transaction can end
46 : : */
47 : : atomic_t num_writers;
48 : : atomic_t use_count;
49 : :
50 : : /* Be protected by fs_info->trans_lock when we want to change it. */
51 : : enum btrfs_trans_state state;
52 : : struct list_head list;
53 : : struct extent_io_tree dirty_pages;
54 : : unsigned long start_time;
55 : : wait_queue_head_t writer_wait;
56 : : wait_queue_head_t commit_wait;
57 : : struct list_head pending_snapshots;
58 : : struct list_head ordered_operations;
59 : : struct list_head pending_chunks;
60 : : struct btrfs_delayed_ref_root delayed_refs;
61 : : int aborted;
62 : : };
63 : :
64 : : #define __TRANS_FREEZABLE (1U << 0)
65 : :
66 : : #define __TRANS_USERSPACE (1U << 8)
67 : : #define __TRANS_START (1U << 9)
68 : : #define __TRANS_ATTACH (1U << 10)
69 : : #define __TRANS_JOIN (1U << 11)
70 : : #define __TRANS_JOIN_NOLOCK (1U << 12)
71 : :
72 : : #define TRANS_USERSPACE (__TRANS_USERSPACE | __TRANS_FREEZABLE)
73 : : #define TRANS_START (__TRANS_START | __TRANS_FREEZABLE)
74 : : #define TRANS_ATTACH (__TRANS_ATTACH)
75 : : #define TRANS_JOIN (__TRANS_JOIN | __TRANS_FREEZABLE)
76 : : #define TRANS_JOIN_NOLOCK (__TRANS_JOIN_NOLOCK)
77 : :
78 : : #define TRANS_EXTWRITERS (__TRANS_USERSPACE | __TRANS_START | \
79 : : __TRANS_ATTACH)
80 : :
81 : : struct btrfs_trans_handle {
82 : : u64 transid;
83 : : u64 bytes_reserved;
84 : : u64 qgroup_reserved;
85 : : unsigned long use_count;
86 : : unsigned long blocks_reserved;
87 : : unsigned long blocks_used;
88 : : unsigned long delayed_ref_updates;
89 : : struct btrfs_transaction *transaction;
90 : : struct btrfs_block_rsv *block_rsv;
91 : : struct btrfs_block_rsv *orig_rsv;
92 : : short aborted;
93 : : short adding_csums;
94 : : bool allocating_chunk;
95 : : bool reloc_reserved;
96 : : unsigned int type;
97 : : /*
98 : : * this root is only needed to validate that the root passed to
99 : : * start_transaction is the same as the one passed to end_transaction.
100 : : * Subvolume quota depends on this
101 : : */
102 : : struct btrfs_root *root;
103 : : struct seq_list delayed_ref_elem;
104 : : struct list_head qgroup_ref_list;
105 : : struct list_head new_bgs;
106 : : };
107 : :
108 : : struct btrfs_pending_snapshot {
109 : : struct dentry *dentry;
110 : : struct inode *dir;
111 : : struct btrfs_root *root;
112 : : struct btrfs_root *snap;
113 : : struct btrfs_qgroup_inherit *inherit;
114 : : /* block reservation for the operation */
115 : : struct btrfs_block_rsv block_rsv;
116 : : u64 qgroup_reserved;
117 : : /* extra metadata reseration for relocation */
118 : : int error;
119 : : bool readonly;
120 : : struct list_head list;
121 : : };
122 : :
123 : : static inline void btrfs_set_inode_last_trans(struct btrfs_trans_handle *trans,
124 : : struct inode *inode)
125 : : {
126 : 0 : BTRFS_I(inode)->last_trans = trans->transaction->transid;
127 : 0 : BTRFS_I(inode)->last_sub_trans = BTRFS_I(inode)->root->log_transid;
128 : 0 : BTRFS_I(inode)->last_log_commit = BTRFS_I(inode)->root->last_log_commit;
129 : : }
130 : :
131 : : int btrfs_end_transaction(struct btrfs_trans_handle *trans,
132 : : struct btrfs_root *root);
133 : : struct btrfs_trans_handle *btrfs_start_transaction(struct btrfs_root *root,
134 : : int num_items);
135 : : struct btrfs_trans_handle *btrfs_start_transaction_lflush(
136 : : struct btrfs_root *root, int num_items);
137 : : struct btrfs_trans_handle *btrfs_join_transaction(struct btrfs_root *root);
138 : : struct btrfs_trans_handle *btrfs_join_transaction_nolock(struct btrfs_root *root);
139 : : struct btrfs_trans_handle *btrfs_attach_transaction(struct btrfs_root *root);
140 : : struct btrfs_trans_handle *btrfs_attach_transaction_barrier(
141 : : struct btrfs_root *root);
142 : : struct btrfs_trans_handle *btrfs_start_ioctl_transaction(struct btrfs_root *root);
143 : : int btrfs_wait_for_commit(struct btrfs_root *root, u64 transid);
144 : : int btrfs_write_and_wait_transaction(struct btrfs_trans_handle *trans,
145 : : struct btrfs_root *root);
146 : :
147 : : void btrfs_add_dead_root(struct btrfs_root *root);
148 : : int btrfs_defrag_root(struct btrfs_root *root);
149 : : int btrfs_clean_one_deleted_snapshot(struct btrfs_root *root);
150 : : int btrfs_commit_transaction(struct btrfs_trans_handle *trans,
151 : : struct btrfs_root *root);
152 : : int btrfs_commit_transaction_async(struct btrfs_trans_handle *trans,
153 : : struct btrfs_root *root,
154 : : int wait_for_unblock);
155 : : int btrfs_end_transaction_throttle(struct btrfs_trans_handle *trans,
156 : : struct btrfs_root *root);
157 : : int btrfs_end_transaction_dmeta(struct btrfs_trans_handle *trans,
158 : : struct btrfs_root *root);
159 : : int btrfs_should_end_transaction(struct btrfs_trans_handle *trans,
160 : : struct btrfs_root *root);
161 : : void btrfs_throttle(struct btrfs_root *root);
162 : : int btrfs_record_root_in_trans(struct btrfs_trans_handle *trans,
163 : : struct btrfs_root *root);
164 : : int btrfs_write_marked_extents(struct btrfs_root *root,
165 : : struct extent_io_tree *dirty_pages, int mark);
166 : : int btrfs_wait_marked_extents(struct btrfs_root *root,
167 : : struct extent_io_tree *dirty_pages, int mark);
168 : : int btrfs_transaction_blocked(struct btrfs_fs_info *info);
169 : : int btrfs_transaction_in_commit(struct btrfs_fs_info *info);
170 : : void btrfs_put_transaction(struct btrfs_transaction *transaction);
171 : : #endif
|