Blame view

fs/ext4/ext4_jbd2.h 10.2 KB
470decc61   Dave Kleikamp   [PATCH] jbd2: ini...
1
  /*
3dcf54515   Christoph Hellwig   ext4: move header...
2
   * ext4_jbd2.h
470decc61   Dave Kleikamp   [PATCH] jbd2: ini...
3
4
5
6
7
8
9
10
11
12
13
   *
   * Written by Stephen C. Tweedie <sct@redhat.com>, 1999
   *
   * Copyright 1998--1999 Red Hat corp --- All Rights Reserved
   *
   * This file is part of the Linux kernel and is made available under
   * the terms of the GNU General Public License, version 2, or at your
   * option, any later version, incorporated herein by reference.
   *
   * Ext4-specific journaling extensions.
   */
3dcf54515   Christoph Hellwig   ext4: move header...
14
15
  #ifndef _EXT4_JBD2_H
  #define _EXT4_JBD2_H
470decc61   Dave Kleikamp   [PATCH] jbd2: ini...
16
17
  
  #include <linux/fs.h>
f7f4bccb7   Mingming Cao   [PATCH] jbd2: ren...
18
  #include <linux/jbd2.h>
3dcf54515   Christoph Hellwig   ext4: move header...
19
  #include "ext4.h"
470decc61   Dave Kleikamp   [PATCH] jbd2: ini...
20
21
22
23
24
25
26
27
  
  #define EXT4_JOURNAL(inode)	(EXT4_SB((inode)->i_sb)->s_journal)
  
  /* Define the number of blocks we need to account to a transaction to
   * modify one block of data.
   *
   * We may have to touch one inode, one bitmap buffer, up to three
   * indirection blocks, the group and superblock summaries, and the data
a86c61812   Alex Tomas   [PATCH] ext3: add...
28
29
   * block to complete the transaction.
   *
d0d856e8b   Randy Dunlap   [PATCH] ext4: cle...
30
31
   * For extents-enabled fs we may have to allocate and modify up to
   * 5 levels of tree + root which are stored in the inode. */
470decc61   Dave Kleikamp   [PATCH] jbd2: ini...
32

a86c61812   Alex Tomas   [PATCH] ext3: add...
33
  #define EXT4_SINGLEDATA_TRANS_BLOCKS(sb)				\
83982b6f4   Theodore Ts'o   ext4: Remove "ext...
34
35
  	(EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_EXTENTS)   \
  	 ? 27U : 8U)
470decc61   Dave Kleikamp   [PATCH] jbd2: ini...
36
37
38
39
40
41
42
43
44
45
46
47
  
  /* Extended attribute operations touch at most two data buffers,
   * two bitmap buffers, and two group summaries, in addition to the inode
   * and the superblock, which are already accounted for. */
  
  #define EXT4_XATTR_TRANS_BLOCKS		6U
  
  /* Define the minimum size for a transaction which modifies data.  This
   * needs to take into account the fact that we may end up modifying two
   * quota files too (one for the group, one for the user quota).  The
   * superblock only gets updated once, of course, so don't bother
   * counting that again for the quota updates. */
a86c61812   Alex Tomas   [PATCH] ext3: add...
48
  #define EXT4_DATA_TRANS_BLOCKS(sb)	(EXT4_SINGLEDATA_TRANS_BLOCKS(sb) + \
470decc61   Dave Kleikamp   [PATCH] jbd2: ini...
49
  					 EXT4_XATTR_TRANS_BLOCKS - 2 + \
5aca07eb7   Dmitry Monakhov   ext4: quota macro...
50
  					 EXT4_MAXQUOTAS_TRANS_BLOCKS(sb))
470decc61   Dave Kleikamp   [PATCH] jbd2: ini...
51

a02908f19   Mingming Cao   ext4: journal cre...
52
53
54
55
56
57
  /*
   * Define the number of metadata blocks we need to account to modify data.
   *
   * This include super block, inode block, quota blocks and xattr blocks
   */
  #define EXT4_META_TRANS_BLOCKS(sb)	(EXT4_XATTR_TRANS_BLOCKS + \
5aca07eb7   Dmitry Monakhov   ext4: quota macro...
58
  					EXT4_MAXQUOTAS_TRANS_BLOCKS(sb))
a02908f19   Mingming Cao   ext4: journal cre...
59

470decc61   Dave Kleikamp   [PATCH] jbd2: ini...
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
  /* Delete operations potentially hit one directory's namespace plus an
   * entire inode, plus arbitrary amounts of bitmap/indirection data.  Be
   * generous.  We can grow the delete transaction later if necessary. */
  
  #define EXT4_DELETE_TRANS_BLOCKS(sb)	(2 * EXT4_DATA_TRANS_BLOCKS(sb) + 64)
  
  /* Define an arbitrary limit for the amount of data we will anticipate
   * writing to any given transaction.  For unbounded transactions such as
   * write(2) and truncate(2) we can write more than this, but we always
   * start off at the maximum transaction size and grow the transaction
   * optimistically as we go. */
  
  #define EXT4_MAX_TRANS_DATA		64U
  
  /* We break up a large truncate or write transaction once the handle's
   * buffer credits gets this low, we need either to extend the
   * transaction or to start a new one.  Reserve enough space here for
   * inode, bitmap, superblock, group and indirection updates for at least
   * one block, plus two quota updates.  Quota allocations are not
   * needed. */
  
  #define EXT4_RESERVE_TRANS_BLOCKS	12U
  
  #define EXT4_INDEX_EXTRA_TRANS_BLOCKS	8
  
  #ifdef CONFIG_QUOTA
  /* Amount of blocks needed for quota update - we know that the structure was
21f976975   Jan Kara   ext4: remove unne...
87
88
   * allocated so we need to update only data block */
  #define EXT4_QUOTA_TRANS_BLOCKS(sb) (test_opt(sb, QUOTA) ? 1 : 0)
470decc61   Dave Kleikamp   [PATCH] jbd2: ini...
89
90
91
  /* Amount of blocks needed for quota insert/delete - we do some block writes
   * but inode, sb and group updates are done only once */
  #define EXT4_QUOTA_INIT_BLOCKS(sb) (test_opt(sb, QUOTA) ? (DQUOT_INIT_ALLOC*\
a86c61812   Alex Tomas   [PATCH] ext3: add...
92
  		(EXT4_SINGLEDATA_TRANS_BLOCKS(sb)-3)+3+DQUOT_INIT_REWRITE) : 0)
5aca07eb7   Dmitry Monakhov   ext4: quota macro...
93

470decc61   Dave Kleikamp   [PATCH] jbd2: ini...
94
  #define EXT4_QUOTA_DEL_BLOCKS(sb) (test_opt(sb, QUOTA) ? (DQUOT_DEL_ALLOC*\
a86c61812   Alex Tomas   [PATCH] ext3: add...
95
  		(EXT4_SINGLEDATA_TRANS_BLOCKS(sb)-3)+3+DQUOT_DEL_REWRITE) : 0)
470decc61   Dave Kleikamp   [PATCH] jbd2: ini...
96
97
98
99
100
  #else
  #define EXT4_QUOTA_TRANS_BLOCKS(sb) 0
  #define EXT4_QUOTA_INIT_BLOCKS(sb) 0
  #define EXT4_QUOTA_DEL_BLOCKS(sb) 0
  #endif
5aca07eb7   Dmitry Monakhov   ext4: quota macro...
101
102
103
  #define EXT4_MAXQUOTAS_TRANS_BLOCKS(sb) (MAXQUOTAS*EXT4_QUOTA_TRANS_BLOCKS(sb))
  #define EXT4_MAXQUOTAS_INIT_BLOCKS(sb) (MAXQUOTAS*EXT4_QUOTA_INIT_BLOCKS(sb))
  #define EXT4_MAXQUOTAS_DEL_BLOCKS(sb) (MAXQUOTAS*EXT4_QUOTA_DEL_BLOCKS(sb))
470decc61   Dave Kleikamp   [PATCH] jbd2: ini...
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
  
  int
  ext4_mark_iloc_dirty(handle_t *handle,
  		     struct inode *inode,
  		     struct ext4_iloc *iloc);
  
  /*
   * On success, We end up with an outstanding reference count against
   * iloc->bh.  This _must_ be cleaned up later.
   */
  
  int ext4_reserve_inode_write(handle_t *handle, struct inode *inode,
  			struct ext4_iloc *iloc);
  
  int ext4_mark_inode_dirty(handle_t *handle, struct inode *inode);
  
  /*
e4684b3fb   Theodore Ts'o   ext4: fold ext4_j...
121
   * Wrapper functions with which ext4 calls into JBD.
470decc61   Dave Kleikamp   [PATCH] jbd2: ini...
122
   */
90c7201b9   Theodore Ts'o   ext4: Pass line n...
123
124
  void ext4_journal_abort_handle(const char *caller, unsigned int line,
  			       const char *err_fn,
8984d137d   Andrew Morton   [PATCH] ext4: uni...
125
  		struct buffer_head *bh, handle_t *handle, int err);
470decc61   Dave Kleikamp   [PATCH] jbd2: ini...
126

90c7201b9   Theodore Ts'o   ext4: Pass line n...
127
128
  int __ext4_journal_get_write_access(const char *where, unsigned int line,
  				    handle_t *handle, struct buffer_head *bh);
470decc61   Dave Kleikamp   [PATCH] jbd2: ini...
129

90c7201b9   Theodore Ts'o   ext4: Pass line n...
130
131
132
  int __ext4_forget(const char *where, unsigned int line, handle_t *handle,
  		  int is_metadata, struct inode *inode,
  		  struct buffer_head *bh, ext4_fsblk_t blocknr);
d6797d14b   Theodore Ts'o   ext4: move ext4_f...
133

90c7201b9   Theodore Ts'o   ext4: Pass line n...
134
  int __ext4_journal_get_create_access(const char *where, unsigned int line,
8984d137d   Andrew Morton   [PATCH] ext4: uni...
135
  				handle_t *handle, struct buffer_head *bh);
470decc61   Dave Kleikamp   [PATCH] jbd2: ini...
136

90c7201b9   Theodore Ts'o   ext4: Pass line n...
137
138
139
  int __ext4_handle_dirty_metadata(const char *where, unsigned int line,
  				 handle_t *handle, struct inode *inode,
  				 struct buffer_head *bh);
470decc61   Dave Kleikamp   [PATCH] jbd2: ini...
140

90c7201b9   Theodore Ts'o   ext4: Pass line n...
141
142
  int __ext4_handle_dirty_super(const char *where, unsigned int line,
  			      handle_t *handle, struct super_block *sb);
a0375156c   Theodore Ts'o   ext4: Clean up s_...
143

470decc61   Dave Kleikamp   [PATCH] jbd2: ini...
144
  #define ext4_journal_get_write_access(handle, bh) \
90c7201b9   Theodore Ts'o   ext4: Pass line n...
145
  	__ext4_journal_get_write_access(__func__, __LINE__, (handle), (bh))
d6797d14b   Theodore Ts'o   ext4: move ext4_f...
146
  #define ext4_forget(handle, is_metadata, inode, bh, block_nr) \
90c7201b9   Theodore Ts'o   ext4: Pass line n...
147
148
  	__ext4_forget(__func__, __LINE__, (handle), (is_metadata), (inode), \
  		      (bh), (block_nr))
470decc61   Dave Kleikamp   [PATCH] jbd2: ini...
149
  #define ext4_journal_get_create_access(handle, bh) \
90c7201b9   Theodore Ts'o   ext4: Pass line n...
150
  	__ext4_journal_get_create_access(__func__, __LINE__, (handle), (bh))
0390131ba   Frank Mayhar   ext4: Allow ext4 ...
151
  #define ext4_handle_dirty_metadata(handle, inode, bh) \
90c7201b9   Theodore Ts'o   ext4: Pass line n...
152
153
  	__ext4_handle_dirty_metadata(__func__, __LINE__, (handle), (inode), \
  				     (bh))
a0375156c   Theodore Ts'o   ext4: Clean up s_...
154
  #define ext4_handle_dirty_super(handle, sb) \
90c7201b9   Theodore Ts'o   ext4: Pass line n...
155
  	__ext4_handle_dirty_super(__func__, __LINE__, (handle), (sb))
470decc61   Dave Kleikamp   [PATCH] jbd2: ini...
156

470decc61   Dave Kleikamp   [PATCH] jbd2: ini...
157
  handle_t *ext4_journal_start_sb(struct super_block *sb, int nblocks);
c398eda0e   Theodore Ts'o   ext4: Pass line n...
158
  int __ext4_journal_stop(const char *where, unsigned int line, handle_t *handle);
470decc61   Dave Kleikamp   [PATCH] jbd2: ini...
159

d3d1faf6a   Curt Wohlgemuth   ext4: Handle nest...
160
  #define EXT4_NOJOURNAL_MAX_REF_COUNT ((unsigned long) 4096)
0390131ba   Frank Mayhar   ext4: Allow ext4 ...
161

d3d1faf6a   Curt Wohlgemuth   ext4: Handle nest...
162
163
  /* Note:  Do not use this for NULL handles.  This is only to determine if
   * a properly allocated handle is using a journal or not. */
0390131ba   Frank Mayhar   ext4: Allow ext4 ...
164
165
  static inline int ext4_handle_valid(handle_t *handle)
  {
d3d1faf6a   Curt Wohlgemuth   ext4: Handle nest...
166
  	if ((unsigned long)handle < EXT4_NOJOURNAL_MAX_REF_COUNT)
0390131ba   Frank Mayhar   ext4: Allow ext4 ...
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
  		return 0;
  	return 1;
  }
  
  static inline void ext4_handle_sync(handle_t *handle)
  {
  	if (ext4_handle_valid(handle))
  		handle->h_sync = 1;
  }
  
  static inline void ext4_handle_release_buffer(handle_t *handle,
  						struct buffer_head *bh)
  {
  	if (ext4_handle_valid(handle))
  		jbd2_journal_release_buffer(handle, bh);
  }
  
  static inline int ext4_handle_is_aborted(handle_t *handle)
  {
  	if (ext4_handle_valid(handle))
  		return is_handle_aborted(handle);
  	return 0;
  }
  
  static inline int ext4_handle_has_enough_credits(handle_t *handle, int needed)
  {
  	if (ext4_handle_valid(handle) && handle->h_buffer_credits < needed)
  		return 0;
  	return 1;
  }
470decc61   Dave Kleikamp   [PATCH] jbd2: ini...
197
198
199
200
201
202
  static inline handle_t *ext4_journal_start(struct inode *inode, int nblocks)
  {
  	return ext4_journal_start_sb(inode->i_sb, nblocks);
  }
  
  #define ext4_journal_stop(handle) \
c398eda0e   Theodore Ts'o   ext4: Pass line n...
203
  	__ext4_journal_stop(__func__, __LINE__, (handle))
470decc61   Dave Kleikamp   [PATCH] jbd2: ini...
204
205
206
207
208
209
210
211
  
  static inline handle_t *ext4_journal_current_handle(void)
  {
  	return journal_current_handle();
  }
  
  static inline int ext4_journal_extend(handle_t *handle, int nblocks)
  {
0390131ba   Frank Mayhar   ext4: Allow ext4 ...
212
213
214
  	if (ext4_handle_valid(handle))
  		return jbd2_journal_extend(handle, nblocks);
  	return 0;
470decc61   Dave Kleikamp   [PATCH] jbd2: ini...
215
216
217
218
  }
  
  static inline int ext4_journal_restart(handle_t *handle, int nblocks)
  {
0390131ba   Frank Mayhar   ext4: Allow ext4 ...
219
220
221
  	if (ext4_handle_valid(handle))
  		return jbd2_journal_restart(handle, nblocks);
  	return 0;
470decc61   Dave Kleikamp   [PATCH] jbd2: ini...
222
223
224
225
  }
  
  static inline int ext4_journal_blocks_per_page(struct inode *inode)
  {
0390131ba   Frank Mayhar   ext4: Allow ext4 ...
226
227
228
  	if (EXT4_JOURNAL(inode) != NULL)
  		return jbd2_journal_blocks_per_page(inode);
  	return 0;
470decc61   Dave Kleikamp   [PATCH] jbd2: ini...
229
230
231
232
  }
  
  static inline int ext4_journal_force_commit(journal_t *journal)
  {
0390131ba   Frank Mayhar   ext4: Allow ext4 ...
233
234
235
  	if (journal)
  		return jbd2_journal_force_commit(journal);
  	return 0;
470decc61   Dave Kleikamp   [PATCH] jbd2: ini...
236
  }
678aaf481   Jan Kara   ext4: Use new fra...
237
238
  static inline int ext4_jbd2_file_inode(handle_t *handle, struct inode *inode)
  {
0390131ba   Frank Mayhar   ext4: Allow ext4 ...
239
  	if (ext4_handle_valid(handle))
8aefcd557   Theodore Ts'o   ext4: dynamically...
240
  		return jbd2_journal_file_inode(handle, EXT4_I(inode)->jinode);
0390131ba   Frank Mayhar   ext4: Allow ext4 ...
241
  	return 0;
678aaf481   Jan Kara   ext4: Use new fra...
242
  }
b436b9bef   Jan Kara   ext4: Wait for pr...
243
244
245
246
247
248
249
250
251
252
253
254
  static inline void ext4_update_inode_fsync_trans(handle_t *handle,
  						 struct inode *inode,
  						 int datasync)
  {
  	struct ext4_inode_info *ei = EXT4_I(inode);
  
  	if (ext4_handle_valid(handle)) {
  		ei->i_sync_tid = handle->h_transaction->t_tid;
  		if (datasync)
  			ei->i_datasync_tid = handle->h_transaction->t_tid;
  	}
  }
470decc61   Dave Kleikamp   [PATCH] jbd2: ini...
255
256
257
258
259
  /* super.c */
  int ext4_force_commit(struct super_block *sb);
  
  static inline int ext4_should_journal_data(struct inode *inode)
  {
0390131ba   Frank Mayhar   ext4: Allow ext4 ...
260
261
  	if (EXT4_JOURNAL(inode) == NULL)
  		return 0;
470decc61   Dave Kleikamp   [PATCH] jbd2: ini...
262
263
264
265
  	if (!S_ISREG(inode->i_mode))
  		return 1;
  	if (test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA)
  		return 1;
12e9b8920   Dmitry Monakhov   ext4: Use bitops ...
266
  	if (ext4_test_inode_flag(inode, EXT4_INODE_JOURNAL_DATA))
470decc61   Dave Kleikamp   [PATCH] jbd2: ini...
267
268
269
270
271
272
  		return 1;
  	return 0;
  }
  
  static inline int ext4_should_order_data(struct inode *inode)
  {
0390131ba   Frank Mayhar   ext4: Allow ext4 ...
273
274
  	if (EXT4_JOURNAL(inode) == NULL)
  		return 0;
470decc61   Dave Kleikamp   [PATCH] jbd2: ini...
275
276
  	if (!S_ISREG(inode->i_mode))
  		return 0;
12e9b8920   Dmitry Monakhov   ext4: Use bitops ...
277
  	if (ext4_test_inode_flag(inode, EXT4_INODE_JOURNAL_DATA))
470decc61   Dave Kleikamp   [PATCH] jbd2: ini...
278
279
280
281
282
283
284
285
  		return 0;
  	if (test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_ORDERED_DATA)
  		return 1;
  	return 0;
  }
  
  static inline int ext4_should_writeback_data(struct inode *inode)
  {
5adfee9c1   Theodore Ts'o   ext4: fix no jour...
286
287
  	if (EXT4_JOURNAL(inode) == NULL)
  		return 1;
441c85085   Curt Wohlgemuth   ext4: Fix ext4_sh...
288
289
  	if (!S_ISREG(inode->i_mode))
  		return 0;
12e9b8920   Dmitry Monakhov   ext4: Use bitops ...
290
  	if (ext4_test_inode_flag(inode, EXT4_INODE_JOURNAL_DATA))
470decc61   Dave Kleikamp   [PATCH] jbd2: ini...
291
292
293
294
295
  		return 0;
  	if (test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_WRITEBACK_DATA)
  		return 1;
  	return 0;
  }
744692dc0   Jiaying Zhang   ext4: use ext4_ge...
296
297
298
299
  /*
   * This function controls whether or not we should try to go down the
   * dioread_nolock code paths, which makes it safe to avoid taking
   * i_mutex for direct I/O reads.  This only works for extent-based
206f7ab4f   Christoph Hellwig   ext4: remove vest...
300
301
302
303
   * files, and it doesn't work if data journaling is enabled, since the
   * dioread_nolock code uses b_private to pass information back to the
   * I/O completion handler, and this conflicts with the jbd's use of
   * b_private.
744692dc0   Jiaying Zhang   ext4: use ext4_ge...
304
305
306
307
308
   */
  static inline int ext4_should_dioread_nolock(struct inode *inode)
  {
  	if (!test_opt(inode->i_sb, DIOREAD_NOLOCK))
  		return 0;
744692dc0   Jiaying Zhang   ext4: use ext4_ge...
309
310
  	if (!S_ISREG(inode->i_mode))
  		return 0;
12e9b8920   Dmitry Monakhov   ext4: Use bitops ...
311
  	if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)))
744692dc0   Jiaying Zhang   ext4: use ext4_ge...
312
313
314
315
316
  		return 0;
  	if (ext4_should_journal_data(inode))
  		return 0;
  	return 1;
  }
3dcf54515   Christoph Hellwig   ext4: move header...
317
  #endif	/* _EXT4_JBD2_H */