summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorngkaho1234 <ngkaho1234@gmail.com>2015-12-30 06:34:07 +0000
committergkostka <kostka.grzegorz@gmail.com>2015-12-30 09:33:16 +0100
commitc6448a39371cb3d42b5ffb9d0f0a35648278506c (patch)
tree80d5ce267a9f88269770f76ff621dcc03117ba1d
parentd7284d15564fc5cb4123671ab343480984dbcad2 (diff)
ext4_journal: refactor purging transactions code
Make the code of purging transactions from cp_queue clearer.
-rw-r--r--lwext4/ext4_journal.c77
1 files changed, 35 insertions, 42 deletions
diff --git a/lwext4/ext4_journal.c b/lwext4/ext4_journal.c
index 7c2037e..df50b9f 100644
--- a/lwext4/ext4_journal.c
+++ b/lwext4/ext4_journal.c
@@ -1012,19 +1012,45 @@ jbd_journal_skip_pure_revoke(struct jbd_journal *journal,
jbd_journal_write_sb(journal);
}
-static void jbd_journal_flush_all_trans(struct jbd_journal *journal)
+static void
+jbd_journal_purge_cp_trans(struct jbd_journal *journal,
+ bool flush)
{
- struct jbd_trans *trans, *tmp;
- TAILQ_FOREACH_SAFE(trans, &journal->cp_queue, trans_node,
- tmp) {
+ struct jbd_trans *trans;
+ while ((trans = TAILQ_FIRST(&journal->cp_queue))) {
if (!trans->data_cnt) {
TAILQ_REMOVE(&journal->cp_queue,
trans,
trans_node);
jbd_journal_skip_pure_revoke(journal, trans);
} else {
- ext4_assert(trans->data_cnt != trans->written_cnt);
- jbd_journal_flush_trans(trans);
+ if (trans->data_cnt ==
+ trans->written_cnt) {
+ journal->start =
+ trans->start_iblock +
+ trans->alloc_blocks;
+ wrap(&journal->jbd_fs->sb,
+ journal->start);
+ journal->trans_id =
+ trans->trans_id + 1;
+ TAILQ_REMOVE(&journal->cp_queue,
+ trans,
+ trans_node);
+ jbd_journal_free_trans(journal,
+ trans,
+ false);
+ jbd_journal_write_sb(journal);
+ } else if (!flush) {
+ journal->start =
+ trans->start_iblock;
+ wrap(&journal->jbd_fs->sb,
+ journal->start);
+ journal->trans_id =
+ trans->trans_id;
+ jbd_journal_write_sb(journal);
+ break;
+ } else
+ jbd_journal_flush_trans(trans);
}
}
}
@@ -1043,7 +1069,7 @@ int jbd_journal_stop(struct jbd_journal *journal)
/* Make sure that journalled content have reached
* the disk.*/
- jbd_journal_flush_all_trans(journal);
+ jbd_journal_purge_cp_trans(journal, true);
/* There should be no block record in this journal
* session. */
@@ -1086,7 +1112,7 @@ static uint32_t jbd_journal_alloc_block(struct jbd_journal *journal,
/* If there is no space left, flush all journalled
* blocks to disk first.*/
if (journal->last == journal->start)
- jbd_journal_flush_all_trans(journal);
+ jbd_journal_purge_cp_trans(journal, true);
return start_block;
}
@@ -1629,40 +1655,7 @@ static void jbd_trans_end_write(struct ext4_bcache *bc __unused,
TAILQ_REMOVE(&journal->cp_queue, trans, trans_node);
jbd_journal_free_trans(journal, trans, false);
- while ((trans = TAILQ_FIRST(&journal->cp_queue))) {
- if (!trans->data_cnt) {
- TAILQ_REMOVE(&journal->cp_queue,
- trans,
- trans_node);
- jbd_journal_skip_pure_revoke(journal,
- trans);
- } else {
- if (trans->data_cnt ==
- trans->written_cnt) {
- journal->start =
- trans->start_iblock +
- trans->alloc_blocks;
- wrap(&journal->jbd_fs->sb,
- journal->start);
- journal->trans_id =
- trans->trans_id + 1;
- TAILQ_REMOVE(&journal->cp_queue,
- trans,
- trans_node);
- jbd_journal_free_trans(journal,
- trans,
- false);
- } else {
- journal->start =
- trans->start_iblock;
- wrap(&journal->jbd_fs->sb,
- journal->start);
- journal->trans_id =
- trans->trans_id;
- break;
- }
- }
- }
+ jbd_journal_purge_cp_trans(journal, false);
jbd_journal_write_sb(journal);
jbd_write_sb(journal->jbd_fs);
}