diff options
author | Jan Kara <jack@suse.cz> | 2013-06-04 12:08:56 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2013-06-04 12:08:56 -0400 |
commit | b34090e5e22a02fba0e4473056cce9420ad9dd0b (patch) | |
tree | 7ffb9ecd10ada2aefe9079c2df91405592132e47 /include | |
parent | e5a120aeb57f40ae568a5ca1dd6ace53d0213582 (diff) |
jbd2: refine waiting for shadow buffers
Currently when we add a buffer to a transaction, we wait until the
buffer is removed from BJ_Shadow list (so that we prevent any changes
to the buffer that is just written to the journal). This can take
unnecessarily long as a lot happens between the time the buffer is
submitted to the journal and the time when we remove the buffer from
BJ_Shadow list. (e.g. We wait for all data buffers in the
transaction, we issue a cache flush, etc.) Also this creates a
dependency of do_get_write_access() on transaction commit (namely
waiting for data IO to complete) which we want to avoid when
implementing transaction reservation.
So we modify commit code to set new BH_Shadow flag when temporary
shadowing buffer is created and we clear that flag once IO on that
buffer is complete. This allows do_get_write_access() to wait only
for BH_Shadow bit and thus removes the dependency on data IO
completion.
Reviewed-by: Zheng Liu <wenqing.lz@taobao.com>
Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/jbd.h | 25 | ||||
-rw-r--r-- | include/linux/jbd2.h | 28 | ||||
-rw-r--r-- | include/linux/jbd_common.h | 26 |
3 files changed, 53 insertions, 26 deletions
diff --git a/include/linux/jbd.h b/include/linux/jbd.h index 9c505f1aa1fd..2439054a6c9a 100644 --- a/include/linux/jbd.h +++ b/include/linux/jbd.h | |||
@@ -244,6 +244,31 @@ typedef struct journal_superblock_s | |||
244 | 244 | ||
245 | #include <linux/fs.h> | 245 | #include <linux/fs.h> |
246 | #include <linux/sched.h> | 246 | #include <linux/sched.h> |
247 | |||
248 | enum jbd_state_bits { | ||
249 | BH_JBD /* Has an attached ext3 journal_head */ | ||
250 | = BH_PrivateStart, | ||
251 | BH_JWrite, /* Being written to log (@@@ DEBUGGING) */ | ||
252 | BH_Freed, /* Has been freed (truncated) */ | ||
253 | BH_Revoked, /* Has been revoked from the log */ | ||
254 | BH_RevokeValid, /* Revoked flag is valid */ | ||
255 | BH_JBDDirty, /* Is dirty but journaled */ | ||
256 | BH_State, /* Pins most journal_head state */ | ||
257 | BH_JournalHead, /* Pins bh->b_private and jh->b_bh */ | ||
258 | BH_Unshadow, /* Dummy bit, for BJ_Shadow wakeup filtering */ | ||
259 | BH_JBDPrivateStart, /* First bit available for private use by FS */ | ||
260 | }; | ||
261 | |||
262 | BUFFER_FNS(JBD, jbd) | ||
263 | BUFFER_FNS(JWrite, jwrite) | ||
264 | BUFFER_FNS(JBDDirty, jbddirty) | ||
265 | TAS_BUFFER_FNS(JBDDirty, jbddirty) | ||
266 | BUFFER_FNS(Revoked, revoked) | ||
267 | TAS_BUFFER_FNS(Revoked, revoked) | ||
268 | BUFFER_FNS(RevokeValid, revokevalid) | ||
269 | TAS_BUFFER_FNS(RevokeValid, revokevalid) | ||
270 | BUFFER_FNS(Freed, freed) | ||
271 | |||
247 | #include <linux/jbd_common.h> | 272 | #include <linux/jbd_common.h> |
248 | 273 | ||
249 | #define J_ASSERT(assert) BUG_ON(!(assert)) | 274 | #define J_ASSERT(assert) BUG_ON(!(assert)) |
diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h index b7dc40da99e0..e33e84b3d5c8 100644 --- a/include/linux/jbd2.h +++ b/include/linux/jbd2.h | |||
@@ -302,6 +302,34 @@ typedef struct journal_superblock_s | |||
302 | 302 | ||
303 | #include <linux/fs.h> | 303 | #include <linux/fs.h> |
304 | #include <linux/sched.h> | 304 | #include <linux/sched.h> |
305 | |||
306 | enum jbd_state_bits { | ||
307 | BH_JBD /* Has an attached ext3 journal_head */ | ||
308 | = BH_PrivateStart, | ||
309 | BH_JWrite, /* Being written to log (@@@ DEBUGGING) */ | ||
310 | BH_Freed, /* Has been freed (truncated) */ | ||
311 | BH_Revoked, /* Has been revoked from the log */ | ||
312 | BH_RevokeValid, /* Revoked flag is valid */ | ||
313 | BH_JBDDirty, /* Is dirty but journaled */ | ||
314 | BH_State, /* Pins most journal_head state */ | ||
315 | BH_JournalHead, /* Pins bh->b_private and jh->b_bh */ | ||
316 | BH_Shadow, /* IO on shadow buffer is running */ | ||
317 | BH_Verified, /* Metadata block has been verified ok */ | ||
318 | BH_JBDPrivateStart, /* First bit available for private use by FS */ | ||
319 | }; | ||
320 | |||
321 | BUFFER_FNS(JBD, jbd) | ||
322 | BUFFER_FNS(JWrite, jwrite) | ||
323 | BUFFER_FNS(JBDDirty, jbddirty) | ||
324 | TAS_BUFFER_FNS(JBDDirty, jbddirty) | ||
325 | BUFFER_FNS(Revoked, revoked) | ||
326 | TAS_BUFFER_FNS(Revoked, revoked) | ||
327 | BUFFER_FNS(RevokeValid, revokevalid) | ||
328 | TAS_BUFFER_FNS(RevokeValid, revokevalid) | ||
329 | BUFFER_FNS(Freed, freed) | ||
330 | BUFFER_FNS(Shadow, shadow) | ||
331 | BUFFER_FNS(Verified, verified) | ||
332 | |||
305 | #include <linux/jbd_common.h> | 333 | #include <linux/jbd_common.h> |
306 | 334 | ||
307 | #define J_ASSERT(assert) BUG_ON(!(assert)) | 335 | #define J_ASSERT(assert) BUG_ON(!(assert)) |
diff --git a/include/linux/jbd_common.h b/include/linux/jbd_common.h index 6133679bc4c0..b1f708976ffd 100644 --- a/include/linux/jbd_common.h +++ b/include/linux/jbd_common.h | |||
@@ -1,32 +1,6 @@ | |||
1 | #ifndef _LINUX_JBD_STATE_H | 1 | #ifndef _LINUX_JBD_STATE_H |
2 | #define _LINUX_JBD_STATE_H | 2 | #define _LINUX_JBD_STATE_H |
3 | 3 | ||
4 | enum jbd_state_bits { | ||
5 | BH_JBD /* Has an attached ext3 journal_head */ | ||
6 | = BH_PrivateStart, | ||
7 | BH_JWrite, /* Being written to log (@@@ DEBUGGING) */ | ||
8 | BH_Freed, /* Has been freed (truncated) */ | ||
9 | BH_Revoked, /* Has been revoked from the log */ | ||
10 | BH_RevokeValid, /* Revoked flag is valid */ | ||
11 | BH_JBDDirty, /* Is dirty but journaled */ | ||
12 | BH_State, /* Pins most journal_head state */ | ||
13 | BH_JournalHead, /* Pins bh->b_private and jh->b_bh */ | ||
14 | BH_Unshadow, /* Dummy bit, for BJ_Shadow wakeup filtering */ | ||
15 | BH_Verified, /* Metadata block has been verified ok */ | ||
16 | BH_JBDPrivateStart, /* First bit available for private use by FS */ | ||
17 | }; | ||
18 | |||
19 | BUFFER_FNS(JBD, jbd) | ||
20 | BUFFER_FNS(JWrite, jwrite) | ||
21 | BUFFER_FNS(JBDDirty, jbddirty) | ||
22 | TAS_BUFFER_FNS(JBDDirty, jbddirty) | ||
23 | BUFFER_FNS(Revoked, revoked) | ||
24 | TAS_BUFFER_FNS(Revoked, revoked) | ||
25 | BUFFER_FNS(RevokeValid, revokevalid) | ||
26 | TAS_BUFFER_FNS(RevokeValid, revokevalid) | ||
27 | BUFFER_FNS(Freed, freed) | ||
28 | BUFFER_FNS(Verified, verified) | ||
29 | |||
30 | static inline struct buffer_head *jh2bh(struct journal_head *jh) | 4 | static inline struct buffer_head *jh2bh(struct journal_head *jh) |
31 | { | 5 | { |
32 | return jh->b_bh; | 6 | return jh->b_bh; |