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/linux/jbd.h | |
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/linux/jbd.h')
-rw-r--r-- | include/linux/jbd.h | 25 |
1 files changed, 25 insertions, 0 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)) |