1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#ifndef _EXT4_JBD2_H
16#define _EXT4_JBD2_H
17
18#include <linux/fs.h>
19#include <linux/jbd2.h>
20#include "ext4.h"
21
22#define EXT4_JOURNAL(inode) (EXT4_SB((inode)->i_sb)->s_journal)
23
24
25
26
27
28
29
30
31
32
33
34#define EXT4_SINGLEDATA_TRANS_BLOCKS(sb) \
35 (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_EXTENTS) \
36 ? 27U : 8U)
37
38
39
40
41
42#define EXT4_XATTR_TRANS_BLOCKS 6U
43
44
45
46
47
48
49
50#define EXT4_DATA_TRANS_BLOCKS(sb) (EXT4_SINGLEDATA_TRANS_BLOCKS(sb) + \
51 EXT4_XATTR_TRANS_BLOCKS - 2 + \
52 2*EXT4_QUOTA_TRANS_BLOCKS(sb))
53
54
55
56
57
58
59#define EXT4_META_TRANS_BLOCKS(sb) (EXT4_XATTR_TRANS_BLOCKS + \
60 2*EXT4_QUOTA_TRANS_BLOCKS(sb))
61
62
63
64
65
66#define EXT4_DELETE_TRANS_BLOCKS(sb) (2 * EXT4_DATA_TRANS_BLOCKS(sb) + 64)
67
68
69
70
71
72
73
74#define EXT4_MAX_TRANS_DATA 64U
75
76
77
78
79
80
81
82
83#define EXT4_RESERVE_TRANS_BLOCKS 12U
84
85#define EXT4_INDEX_EXTRA_TRANS_BLOCKS 8
86
87#ifdef CONFIG_QUOTA
88
89
90#define EXT4_QUOTA_TRANS_BLOCKS(sb) (test_opt(sb, QUOTA) ? 2 : 0)
91
92
93#define EXT4_QUOTA_INIT_BLOCKS(sb) (test_opt(sb, QUOTA) ? (DQUOT_INIT_ALLOC*\
94 (EXT4_SINGLEDATA_TRANS_BLOCKS(sb)-3)+3+DQUOT_INIT_REWRITE) : 0)
95#define EXT4_QUOTA_DEL_BLOCKS(sb) (test_opt(sb, QUOTA) ? (DQUOT_DEL_ALLOC*\
96 (EXT4_SINGLEDATA_TRANS_BLOCKS(sb)-3)+3+DQUOT_DEL_REWRITE) : 0)
97#else
98#define EXT4_QUOTA_TRANS_BLOCKS(sb) 0
99#define EXT4_QUOTA_INIT_BLOCKS(sb) 0
100#define EXT4_QUOTA_DEL_BLOCKS(sb) 0
101#endif
102
103int
104ext4_mark_iloc_dirty(handle_t *handle,
105 struct inode *inode,
106 struct ext4_iloc *iloc);
107
108
109
110
111
112
113int ext4_reserve_inode_write(handle_t *handle, struct inode *inode,
114 struct ext4_iloc *iloc);
115
116int ext4_mark_inode_dirty(handle_t *handle, struct inode *inode);
117
118
119
120
121
122
123
124
125void ext4_journal_abort_handle(const char *caller, const char *err_fn,
126 struct buffer_head *bh, handle_t *handle, int err);
127
128int __ext4_journal_get_undo_access(const char *where, handle_t *handle,
129 struct buffer_head *bh);
130
131int __ext4_journal_get_write_access(const char *where, handle_t *handle,
132 struct buffer_head *bh);
133
134
135int __ext4_journal_forget(const char *where, handle_t *handle,
136 struct buffer_head *bh);
137
138
139int __ext4_journal_revoke(const char *where, handle_t *handle,
140 ext4_fsblk_t blocknr, struct buffer_head *bh);
141
142int __ext4_journal_get_create_access(const char *where,
143 handle_t *handle, struct buffer_head *bh);
144
145int __ext4_handle_dirty_metadata(const char *where, handle_t *handle,
146 struct inode *inode, struct buffer_head *bh);
147
148#define ext4_journal_get_undo_access(handle, bh) \
149 __ext4_journal_get_undo_access(__func__, (handle), (bh))
150#define ext4_journal_get_write_access(handle, bh) \
151 __ext4_journal_get_write_access(__func__, (handle), (bh))
152#define ext4_journal_revoke(handle, blocknr, bh) \
153 __ext4_journal_revoke(__func__, (handle), (blocknr), (bh))
154#define ext4_journal_get_create_access(handle, bh) \
155 __ext4_journal_get_create_access(__func__, (handle), (bh))
156#define ext4_journal_forget(handle, bh) \
157 __ext4_journal_forget(__func__, (handle), (bh))
158#define ext4_handle_dirty_metadata(handle, inode, bh) \
159 __ext4_handle_dirty_metadata(__func__, (handle), (inode), (bh))
160
161handle_t *ext4_journal_start_sb(struct super_block *sb, int nblocks);
162int __ext4_journal_stop(const char *where, handle_t *handle);
163
164#define EXT4_NOJOURNAL_MAX_REF_COUNT ((unsigned long) 4096)
165
166
167
168static inline int ext4_handle_valid(handle_t *handle)
169{
170 if ((unsigned long)handle < EXT4_NOJOURNAL_MAX_REF_COUNT)
171 return 0;
172 return 1;
173}
174
175static inline void ext4_handle_sync(handle_t *handle)
176{
177 if (ext4_handle_valid(handle))
178 handle->h_sync = 1;
179}
180
181static inline void ext4_handle_release_buffer(handle_t *handle,
182 struct buffer_head *bh)
183{
184 if (ext4_handle_valid(handle))
185 jbd2_journal_release_buffer(handle, bh);
186}
187
188static inline int ext4_handle_is_aborted(handle_t *handle)
189{
190 if (ext4_handle_valid(handle))
191 return is_handle_aborted(handle);
192 return 0;
193}
194
195static inline int ext4_handle_has_enough_credits(handle_t *handle, int needed)
196{
197 if (ext4_handle_valid(handle) && handle->h_buffer_credits < needed)
198 return 0;
199 return 1;
200}
201
202static inline void ext4_journal_release_buffer(handle_t *handle,
203 struct buffer_head *bh)
204{
205 if (ext4_handle_valid(handle))
206 jbd2_journal_release_buffer(handle, bh);
207}
208
209static inline handle_t *ext4_journal_start(struct inode *inode, int nblocks)
210{
211 return ext4_journal_start_sb(inode->i_sb, nblocks);
212}
213
214#define ext4_journal_stop(handle) \
215 __ext4_journal_stop(__func__, (handle))
216
217static inline handle_t *ext4_journal_current_handle(void)
218{
219 return journal_current_handle();
220}
221
222static inline int ext4_journal_extend(handle_t *handle, int nblocks)
223{
224 if (ext4_handle_valid(handle))
225 return jbd2_journal_extend(handle, nblocks);
226 return 0;
227}
228
229static inline int ext4_journal_restart(handle_t *handle, int nblocks)
230{
231 if (ext4_handle_valid(handle))
232 return jbd2_journal_restart(handle, nblocks);
233 return 0;
234}
235
236static inline int ext4_journal_blocks_per_page(struct inode *inode)
237{
238 if (EXT4_JOURNAL(inode) != NULL)
239 return jbd2_journal_blocks_per_page(inode);
240 return 0;
241}
242
243static inline int ext4_journal_force_commit(journal_t *journal)
244{
245 if (journal)
246 return jbd2_journal_force_commit(journal);
247 return 0;
248}
249
250static inline int ext4_jbd2_file_inode(handle_t *handle, struct inode *inode)
251{
252 if (ext4_handle_valid(handle))
253 return jbd2_journal_file_inode(handle, &EXT4_I(inode)->jinode);
254 return 0;
255}
256
257
258int ext4_force_commit(struct super_block *sb);
259
260static inline int ext4_should_journal_data(struct inode *inode)
261{
262 if (EXT4_JOURNAL(inode) == NULL)
263 return 0;
264 if (!S_ISREG(inode->i_mode))
265 return 1;
266 if (test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA)
267 return 1;
268 if (EXT4_I(inode)->i_flags & EXT4_JOURNAL_DATA_FL)
269 return 1;
270 return 0;
271}
272
273static inline int ext4_should_order_data(struct inode *inode)
274{
275 if (EXT4_JOURNAL(inode) == NULL)
276 return 0;
277 if (!S_ISREG(inode->i_mode))
278 return 0;
279 if (EXT4_I(inode)->i_flags & EXT4_JOURNAL_DATA_FL)
280 return 0;
281 if (test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_ORDERED_DATA)
282 return 1;
283 return 0;
284}
285
286static inline int ext4_should_writeback_data(struct inode *inode)
287{
288 if (!S_ISREG(inode->i_mode))
289 return 0;
290 if (EXT4_JOURNAL(inode) == NULL)
291 return 1;
292 if (EXT4_I(inode)->i_flags & EXT4_JOURNAL_DATA_FL)
293 return 0;
294 if (test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_WRITEBACK_DATA)
295 return 1;
296 return 0;
297}
298
299#endif
300