|
@@ -564,6 +564,38 @@ int log_wait_commit(journal_t *journal, tid_t tid)
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * Return 1 if a given transaction has not yet sent barrier request
|
|
|
|
+ * connected with a transaction commit. If 0 is returned, transaction
|
|
|
|
+ * may or may not have sent the barrier. Used to avoid sending barrier
|
|
|
|
+ * twice in common cases.
|
|
|
|
+ */
|
|
|
|
+int journal_trans_will_send_data_barrier(journal_t *journal, tid_t tid)
|
|
|
|
+{
|
|
|
|
+ int ret = 0;
|
|
|
|
+ transaction_t *commit_trans;
|
|
|
|
+
|
|
|
|
+ if (!(journal->j_flags & JFS_BARRIER))
|
|
|
|
+ return 0;
|
|
|
|
+ spin_lock(&journal->j_state_lock);
|
|
|
|
+ /* Transaction already committed? */
|
|
|
|
+ if (tid_geq(journal->j_commit_sequence, tid))
|
|
|
|
+ goto out;
|
|
|
|
+ /*
|
|
|
|
+ * Transaction is being committed and we already proceeded to
|
|
|
|
+ * writing commit record?
|
|
|
|
+ */
|
|
|
|
+ commit_trans = journal->j_committing_transaction;
|
|
|
|
+ if (commit_trans && commit_trans->t_tid == tid &&
|
|
|
|
+ commit_trans->t_state >= T_COMMIT_RECORD)
|
|
|
|
+ goto out;
|
|
|
|
+ ret = 1;
|
|
|
|
+out:
|
|
|
|
+ spin_unlock(&journal->j_state_lock);
|
|
|
|
+ return ret;
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL(journal_commit_will_send_barrier);
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* Log buffer allocation routines:
|
|
* Log buffer allocation routines:
|
|
*/
|
|
*/
|
|
@@ -1157,6 +1189,7 @@ int journal_destroy(journal_t *journal)
|
|
{
|
|
{
|
|
int err = 0;
|
|
int err = 0;
|
|
|
|
|
|
|
|
+
|
|
/* Wait for the commit thread to wake up and die. */
|
|
/* Wait for the commit thread to wake up and die. */
|
|
journal_kill_thread(journal);
|
|
journal_kill_thread(journal);
|
|
|
|
|