ext4: inline ext4_writepage() into mpage_da_submit_io()
[pandora-kernel.git] / fs / jbd2 / transaction.c
index d95cc9d..6bf0a24 100644 (file)
@@ -81,6 +81,32 @@ jbd2_get_transaction(journal_t *journal, transaction_t *transaction)
  * of that one update.
  */
 
+/*
+ * Update transiaction's maximum wait time, if debugging is enabled.
+ *
+ * In order for t_max_wait to be reliable, it must be protected by a
+ * lock.  But doing so will mean that start_this_handle() can not be
+ * run in parallel on SMP systems, which limits our scalability.  So
+ * unless debugging is enabled, we no longer update t_max_wait, which
+ * means that maximum wait time reported by the jbd2_run_stats
+ * tracepoint will always be zero.
+ */
+static inline void update_t_max_wait(transaction_t *transaction)
+{
+#ifdef CONFIG_JBD2_DEBUG
+       unsigned long ts = jiffies;
+
+       if (jbd2_journal_enable_debug &&
+           time_after(transaction->t_start, ts)) {
+               ts = jbd2_time_diff(ts, transaction->t_start);
+               spin_lock(&transaction->t_handle_lock);
+               if (ts > transaction->t_max_wait)
+                       transaction->t_max_wait = ts;
+               spin_unlock(&transaction->t_handle_lock);
+       }
+#endif
+}
+
 /*
  * start_this_handle: Given a handle, deal with any locking or stalling
  * needed to make sure that there is enough journal space for the handle
@@ -95,7 +121,6 @@ static int start_this_handle(journal_t *journal, handle_t *handle,
        int needed;
        int nblocks = handle->h_buffer_credits;
        transaction_t *new_transaction = NULL;
-       unsigned long ts = jiffies;
 
        if (nblocks > journal->j_max_transaction_buffers) {
                printk(KERN_ERR "JBD: %s wants too many credits (%d > %d)\n",
@@ -131,6 +156,7 @@ alloc_transaction:
         */
 repeat:
        read_lock(&journal->j_state_lock);
+       BUG_ON(journal->j_flags & JBD2_UNMOUNT);
        if (is_journal_aborted(journal) ||
            (journal->j_errno != 0 && !(journal->j_flags & JBD2_ACK_ERR))) {
                read_unlock(&journal->j_state_lock);
@@ -241,25 +267,8 @@ repeat:
 
        /* OK, account for the buffers that this operation expects to
         * use and add the handle to the running transaction. 
-        *
-        * In order for t_max_wait to be reliable, it must be
-        * protected by a lock.  But doing so will mean that
-        * start_this_handle() can not be run in parallel on SMP
-        * systems, which limits our scalability.  So we only enable
-        * it when debugging is enabled.  We may want to use a
-        * separate flag, eventually, so we can enable this
-        * independently of debugging.
         */
-#ifdef CONFIG_JBD2_DEBUG
-       if (jbd2_journal_enable_debug &&
-           time_after(transaction->t_start, ts)) {
-               ts = jbd2_time_diff(ts, transaction->t_start);
-               spin_lock(&transaction->t_handle_lock);
-               if (ts > transaction->t_max_wait)
-                       transaction->t_max_wait = ts;
-               spin_unlock(&transaction->t_handle_lock);
-       }
-#endif
+       update_t_max_wait(transaction);
        handle->h_transaction = transaction;
        atomic_inc(&transaction->t_updates);
        atomic_inc(&transaction->t_handle_count);