1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
25enum 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
35struct btrfs_transaction {
36 u64 transid;
37
38
39
40
41
42 atomic_t num_extwriters;
43
44
45
46
47 atomic_t num_writers;
48 atomic_t use_count;
49
50
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
81struct 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 unsigned int type;
96
97
98
99
100
101 struct btrfs_root *root;
102 struct seq_list delayed_ref_elem;
103 struct list_head qgroup_ref_list;
104 struct list_head new_bgs;
105};
106
107struct btrfs_pending_snapshot {
108 struct dentry *dentry;
109 struct inode *dir;
110 struct btrfs_root *root;
111 struct btrfs_root *snap;
112 struct btrfs_qgroup_inherit *inherit;
113
114 struct btrfs_block_rsv block_rsv;
115 u64 qgroup_reserved;
116
117 int error;
118 bool readonly;
119 struct list_head list;
120};
121
122static inline void btrfs_set_inode_last_trans(struct btrfs_trans_handle *trans,
123 struct inode *inode)
124{
125 BTRFS_I(inode)->last_trans = trans->transaction->transid;
126 BTRFS_I(inode)->last_sub_trans = BTRFS_I(inode)->root->log_transid;
127 BTRFS_I(inode)->last_log_commit = BTRFS_I(inode)->root->last_log_commit;
128}
129
130int btrfs_end_transaction(struct btrfs_trans_handle *trans,
131 struct btrfs_root *root);
132struct btrfs_trans_handle *btrfs_start_transaction(struct btrfs_root *root,
133 int num_items);
134struct btrfs_trans_handle *btrfs_start_transaction_lflush(
135 struct btrfs_root *root, int num_items);
136struct btrfs_trans_handle *btrfs_join_transaction(struct btrfs_root *root);
137struct btrfs_trans_handle *btrfs_join_transaction_nolock(struct btrfs_root *root);
138struct btrfs_trans_handle *btrfs_attach_transaction(struct btrfs_root *root);
139struct btrfs_trans_handle *btrfs_attach_transaction_barrier(
140 struct btrfs_root *root);
141struct btrfs_trans_handle *btrfs_start_ioctl_transaction(struct btrfs_root *root);
142int btrfs_wait_for_commit(struct btrfs_root *root, u64 transid);
143int btrfs_write_and_wait_transaction(struct btrfs_trans_handle *trans,
144 struct btrfs_root *root);
145
146void btrfs_add_dead_root(struct btrfs_root *root);
147int btrfs_defrag_root(struct btrfs_root *root);
148int btrfs_clean_one_deleted_snapshot(struct btrfs_root *root);
149int btrfs_commit_transaction(struct btrfs_trans_handle *trans,
150 struct btrfs_root *root);
151int btrfs_commit_transaction_async(struct btrfs_trans_handle *trans,
152 struct btrfs_root *root,
153 int wait_for_unblock);
154int btrfs_end_transaction_throttle(struct btrfs_trans_handle *trans,
155 struct btrfs_root *root);
156int btrfs_end_transaction_dmeta(struct btrfs_trans_handle *trans,
157 struct btrfs_root *root);
158int btrfs_should_end_transaction(struct btrfs_trans_handle *trans,
159 struct btrfs_root *root);
160void btrfs_throttle(struct btrfs_root *root);
161int btrfs_record_root_in_trans(struct btrfs_trans_handle *trans,
162 struct btrfs_root *root);
163int btrfs_write_marked_extents(struct btrfs_root *root,
164 struct extent_io_tree *dirty_pages, int mark);
165int btrfs_wait_marked_extents(struct btrfs_root *root,
166 struct extent_io_tree *dirty_pages, int mark);
167int btrfs_transaction_blocked(struct btrfs_fs_info *info);
168int btrfs_transaction_in_commit(struct btrfs_fs_info *info);
169#endif
170