summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKaho Ng <ngkaho1234@gmail.com>2016-08-19 02:36:57 +0000
committerKaho Ng <ngkaho1234@gmail.com>2016-08-19 02:36:57 +0000
commit253f1096402014f3ec8bbc721eac2d9a9bf2677a (patch)
tree7ce28e64a708a092acb41990f2ce052efa6cb145 /src
parent053a3f4e32d8536287366f89a9ce23ded4d5e571 (diff)
ext4_journal: tune the logic of block zeroing in write_commit_block()
Diffstat (limited to 'src')
-rw-r--r--src/ext4_journal.c39
1 files changed, 19 insertions, 20 deletions
diff --git a/src/ext4_journal.c b/src/ext4_journal.c
index 01a8c08..9f38290 100644
--- a/src/ext4_journal.c
+++ b/src/ext4_journal.c
@@ -1763,7 +1763,25 @@ static int jbd_trans_write_commit_block(struct jbd_trans *trans)
struct jbd_journal *journal = trans->journal;
commit_iblock = jbd_journal_alloc_block(journal, trans);
- rc = jbd_block_get_noread(journal->jbd_fs, &block, commit_iblock);
+ orig_commit_iblock = commit_iblock;
+ commit_iblock++;
+ wrap(&journal->jbd_fs->sb, commit_iblock);
+
+ /* To prevent accidental reference to stale journalling metadata. */
+ if (orig_commit_iblock < commit_iblock) {
+ rc = jbd_block_get_noread(journal->jbd_fs, &block, commit_iblock);
+ if (rc != EOK)
+ return rc;
+
+ memset(block.data, 0, journal->block_size);
+ ext4_bcache_set_dirty(block.buf);
+ ext4_bcache_set_flag(block.buf, BC_TMP);
+ rc = jbd_block_set(journal->jbd_fs, &block);
+ if (rc != EOK)
+ return rc;
+ }
+
+ rc = jbd_block_get_noread(journal->jbd_fs, &block, orig_commit_iblock);
if (rc != EOK)
return rc;
@@ -1782,25 +1800,6 @@ static int jbd_trans_write_commit_block(struct jbd_trans *trans)
ext4_bcache_set_dirty(block.buf);
ext4_bcache_set_flag(block.buf, BC_TMP);
rc = jbd_block_set(journal->jbd_fs, &block);
- if (rc != EOK)
- return rc;
-
- orig_commit_iblock = commit_iblock;
- commit_iblock++;
- wrap(&journal->jbd_fs->sb, commit_iblock);
-
- /* To prevent accidental reference to stale journalling metadata. */
- if (orig_commit_iblock < commit_iblock) {
- rc = jbd_block_get_noread(journal->jbd_fs, &block, commit_iblock);
- if (rc != EOK)
- return rc;
-
- memset(block.data, 0, journal->block_size);
- ext4_bcache_set_dirty(block.buf);
- ext4_bcache_set_flag(block.buf, BC_TMP);
- rc = jbd_block_set(journal->jbd_fs, &block);
- }
-
return rc;
}