diff options
| author | Kaho Ng <ngkaho1234@gmail.com> | 2016-08-19 02:36:57 +0000 |
|---|---|---|
| committer | Kaho Ng <ngkaho1234@gmail.com> | 2016-08-19 02:36:57 +0000 |
| commit | 253f1096402014f3ec8bbc721eac2d9a9bf2677a (patch) | |
| tree | 7ce28e64a708a092acb41990f2ce052efa6cb145 /src | |
| parent | 053a3f4e32d8536287366f89a9ce23ded4d5e571 (diff) | |
ext4_journal: tune the logic of block zeroing in write_commit_block()
Diffstat (limited to 'src')
| -rw-r--r-- | src/ext4_journal.c | 39 |
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; } |
