summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorngkaho1234 <ngkaho1234@gmail.com>2015-12-18 03:35:59 +0000
committerngkaho1234 <ngkaho1234@gmail.com>2015-12-18 03:39:42 +0000
commit880e69210178f42b98b9f1075ce385ee2327a390 (patch)
tree5e7d054a2abb5264c14b8bcc6a03d9bdc8dd8ef6
parent03a75d6f3bd1332a8ddaa796803b42000a6090ba (diff)
ext4_journal: add jbd_journal_commit_trans routine.
-rw-r--r--lwext4/ext4_journal.c93
-rw-r--r--lwext4/ext4_journal.h2
2 files changed, 54 insertions, 41 deletions
diff --git a/lwext4/ext4_journal.c b/lwext4/ext4_journal.c
index c222c1e..e64d766 100644
--- a/lwext4/ext4_journal.c
+++ b/lwext4/ext4_journal.c
@@ -1412,63 +1412,74 @@ static void jbd_trans_end_write(struct ext4_bcache *bc __unused,
}
}
-/**@brief Commit one transaction on transaction queue
- * to the journal.
- * @param journal current journal session.*/
-void jbd_journal_commit_one(struct jbd_journal *journal)
+/**@brief Commit a transaction to the journal immediately.
+ * @param journal current journal session
+ * @param trans transaction
+ * @return standard error code*/
+int jbd_journal_commit_trans(struct jbd_journal *journal,
+ struct jbd_trans *trans)
{
int rc = EOK;
uint32_t last = journal->last;
- struct jbd_trans *trans;
- if ((trans = TAILQ_FIRST(&journal->trans_queue))) {
- TAILQ_REMOVE(&journal->trans_queue, trans, trans_node);
+ trans->trans_id = journal->alloc_trans_id;
+ rc = jbd_journal_prepare(journal, trans);
+ if (rc != EOK)
+ goto Finish;
- trans->trans_id = journal->alloc_trans_id;
- rc = jbd_journal_prepare(journal, trans);
- if (rc != EOK)
- goto Finish;
+ rc = jbd_journal_prepare_revoke(journal, trans);
+ if (rc != EOK)
+ goto Finish;
- rc = jbd_journal_prepare_revoke(journal, trans);
- if (rc != EOK)
- goto Finish;
+ rc = jbd_trans_write_commit_block(trans);
+ if (rc != EOK)
+ goto Finish;
- rc = jbd_trans_write_commit_block(trans);
- if (rc != EOK)
- goto Finish;
-
- journal->alloc_trans_id++;
- if (TAILQ_EMPTY(&journal->cp_queue)) {
- if (trans->data_cnt) {
- journal->start = trans->start_iblock;
- wrap(&journal->jbd_fs->sb, journal->start);
- journal->trans_id = trans->trans_id;
- jbd_journal_write_sb(journal);
- jbd_write_sb(journal->jbd_fs);
- TAILQ_INSERT_TAIL(&journal->cp_queue, trans,
- trans_node);
- jbd_journal_cp_trans(journal, trans);
- } else {
- journal->start = trans->start_iblock +
- trans->alloc_blocks;
- wrap(&journal->jbd_fs->sb, journal->start);
- journal->trans_id = trans->trans_id + 1;
- jbd_journal_write_sb(journal);
- jbd_journal_free_trans(journal, trans, false);
- }
- } else {
+ journal->alloc_trans_id++;
+ if (TAILQ_EMPTY(&journal->cp_queue)) {
+ if (trans->data_cnt) {
+ journal->start = trans->start_iblock;
+ wrap(&journal->jbd_fs->sb, journal->start);
+ journal->trans_id = trans->trans_id;
+ jbd_journal_write_sb(journal);
+ jbd_write_sb(journal->jbd_fs);
TAILQ_INSERT_TAIL(&journal->cp_queue, trans,
trans_node);
- if (trans->data_cnt)
- jbd_journal_cp_trans(journal, trans);
-
+ jbd_journal_cp_trans(journal, trans);
+ } else {
+ journal->start = trans->start_iblock +
+ trans->alloc_blocks;
+ wrap(&journal->jbd_fs->sb, journal->start);
+ journal->trans_id = trans->trans_id + 1;
+ jbd_journal_write_sb(journal);
+ jbd_journal_free_trans(journal, trans, false);
}
+ } else {
+ TAILQ_INSERT_TAIL(&journal->cp_queue, trans,
+ trans_node);
+ if (trans->data_cnt)
+ jbd_journal_cp_trans(journal, trans);
+
}
Finish:
if (rc != EOK) {
journal->last = last;
jbd_journal_free_trans(journal, trans, true);
}
+ return rc;
+}
+
+/**@brief Commit one transaction on transaction queue
+ * to the journal.
+ * @param journal current journal session.*/
+void jbd_journal_commit_one(struct jbd_journal *journal)
+{
+ struct jbd_trans *trans;
+
+ if ((trans = TAILQ_FIRST(&journal->trans_queue))) {
+ TAILQ_REMOVE(&journal->trans_queue, trans, trans_node);
+ jbd_journal_commit_trans(journal, trans);
+ }
}
/**@brief Commit all the transactions on transaction queue
diff --git a/lwext4/ext4_journal.h b/lwext4/ext4_journal.h
index cc9100d..6206873 100644
--- a/lwext4/ext4_journal.h
+++ b/lwext4/ext4_journal.h
@@ -62,6 +62,8 @@ int jbd_trans_revoke_block(struct jbd_trans *trans,
void jbd_journal_free_trans(struct jbd_journal *journal,
struct jbd_trans *trans,
bool abort);
+int jbd_journal_commit_trans(struct jbd_journal *journal,
+ struct jbd_trans *trans);
void jbd_journal_submit_trans(struct jbd_journal *journal,
struct jbd_trans *trans);
void jbd_journal_commit_one(struct jbd_journal *journal);